Как переместить файл без сохранения разрешений

42

Проблема в том, что я хочу видеть ошибки при перемещении файла, но не вижу ошибки с проблемой разрешений. Другими словами - мне важно, если файл передан не полностью, но я не хочу видеть ошибки, подобные этой:

mv: не удалось сохранить владение для `/home/blah/backup/pgsql.tar.gz ': операция не разрешена

Так что я хочу что - то вроде: mv $backupfile $destination --ignore-permissions.

Файл резервной копии может быть от 1 до 5 ГиБ и передается через NFS.

Nux
источник
Это происходит также на подключенном устройстве NTFS, но это не единственный случай. Это происходит во всех случаях, когда у вас нет прав на изменение разрешений или это невозможно (как в NTFS).
Nux
Это полезно при попытке перемещения файлов, которые почему-то не перемещаются из-за ошибок прав доступа (например, потому что они смонтированы поверх cifs).
Шридхар Сарнобат

Ответы:

56

mvэто неправильный инструмент для этой работы; хочешь cpа потом rm. Поскольку вы перемещаете файл в другую файловую систему, это в точности то, что mvпроисходит за кулисами, за исключением того, что mvоно также пытается сохранить биты прав доступа к файлу и информацию о владельце / группе. Это потому, mvчто сохранит эту информацию, если он перемещает файл в одной и той же файловой системе и mvпопытается вести себя одинаково в обеих ситуациях. Так как вам не нужно сохранять биты прав доступа к файлам и информацию о владельце / группе, не используйте этот инструмент. Используйте cp --no-preserve=modeи rmвместо.

Кайл Джонс
источник
5
Спасибо, это работает. Закончилось делать:, cp --no-preserve=mode,ownership $backupfile $destinationпроверить код выхода и затем сделать, rm $backupfileесли все в порядке.
Nux
22

Когда вы перемещаете файл в той же файловой системе, mvотсоединяет файл от его старого местоположения и присоединяет его к новому местоположению; метаданные, такие как разрешения, остаются прежними. Когда вы перемещаете файл в другую файловую систему, mvкопируете файл, пытаетесь скопировать как можно больше метаданных и удаляете оригинал.

Поскольку вы переходите на другую файловую систему и не хотите копировать много метаданных, вы также можете скопировать файл, а затем удалить оригинал.

cp "$backupfile" "$destination" && rm "$backupfile"

Это до некоторой степени сохраняет права доступа к файлу (например, удобочитаемость, исполняемость). Время модификации файла не сохраняется. С GNUcp вы можете использовать --preserve=…опцию, чтобы контролировать, какие метаданные реплицируются более точно, например --preserve=mode,timestamps.

Вы также можете использовать rsyncи сказать, что вы хотите сохранить. Опция -aозначает «сохранить большинство метаданных», которая включает владельца, если он работает только от имени пользователя root.

rsync -a --no-owner --no-group --remove-source-files "$backupfile" "$destination"
Жиль "ТАК - перестань быть злым"
источник
rsyncРешение работает отлично. Я изо всех сил пытался перенести мою старую версию Ubuntu с общего ресурса CIFS. Мой rsync не сообщал о сбое при перемещении файла, но не перемещал его и только сообщал о проблемах с разрешениями.
Шридхар Сарнобат
+1 за rsyncрешение!
MikeSchinkel