So verschieben Sie eine Datei, ohne die Berechtigungen beizubehalten

42

Das Problem ist, dass ich Fehler beim Verschieben einer Datei sehen möchte, aber keine Fehler mit Berechtigungsproblemen. Mit anderen Worten: Es ist mir wichtig, dass die Datei nicht vollständig übertragen wird, aber Fehler wie diese nicht angezeigt werden sollen:

mv: Besitz für "/home/blah/backup/pgsql.tar.gz" konnte nicht beibehalten werden: Vorgang nicht zulässig

Deshalb möchte ich so etwas wie: mv $backupfile $destination --ignore-permissions.

Die Sicherungsdatei kann zwischen 1 und 5 MB groß sein und wird über NFS übertragen.

Nux
quelle
Dies geschieht auch auf einem angeschlossenen NTFS-Gerät, dies ist jedoch nicht der einzige Fall. Es kommt in allen Fällen vor, in denen Sie keine Rechte zum Ändern von Berechtigungen haben oder dies nicht möglich ist (wie bei NTFS).
Nux
Dies ist nützlich, wenn Sie versuchen, Dateien zu verschieben, die aufgrund von Berechtigungsfehlern nicht verschoben werden (z. B. weil sie übermountet sind cifs).
Sridhar Sarnobat

Antworten:

56

mvist das falsche Werkzeug für diesen Job; du willst cpund dann rm. Da Sie die Datei in ein anderes Dateisystem verschieben, mvgeschieht dies ohnehin genau hinter den Kulissen, mit dem Unterschied, dass mvauch versucht wird, Dateiberechtigungsbits und Eigentümer- / Gruppeninformationen beizubehalten. Dies liegt daran mv, dass diese Informationen erhalten bleiben, wenn eine Datei innerhalb desselben Dateisystems verschoben wird und mvversucht wird, sich in beiden Situationen gleich zu verhalten. Verwenden Sie dieses Tool nicht, da es Ihnen egal ist, ob Dateiberechtigungsbits und Eigentümer- / Gruppeninformationen erhalten bleiben. Verwenden Sie stattdessen cp --no-preserve=modeund rm.

Kyle Jones
quelle
5
Danke, es funktioniert. Am Ende mache ich:, cp --no-preserve=mode,ownership $backupfile $destinationüberprüfe den Exit-Code und tue dann, rm $backupfileob alles in Ordnung ist.
Nux
22

Wenn Sie eine Datei innerhalb desselben Dateisystems verschieben, wird mvdie Datei vom alten Speicherort getrennt und an den neuen Speicherort angehängt. Metadaten wie Berechtigungen bleiben unverändert. Wenn Sie eine Datei in ein anderes Dateisystem verschieben, kopieren Sie mvdie Datei, versuchen, so viele Metadaten wie möglich zu replizieren, und entfernen Sie das Original.

Da Sie in ein anderes Dateisystem wechseln und nicht viele Metadaten replizieren möchten, können Sie die Datei auch kopieren und dann das Original entfernen.

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

Dadurch bleiben die Berechtigungen der Datei in gewissem Umfang erhalten (z. B. Lesbarkeit in der Welt, Ausführbarkeit). Die Änderungszeit der Datei wird nicht beibehalten. Mit GNUcp können Sie mit der --preserve=…Option steuern, welche Metadaten feiner repliziert werden, z --preserve=mode,timestamps.

Sie können es auch verwenden rsyncund angeben, was Sie beibehalten möchten. Die Option -abedeutet, dass die meisten Metadaten erhalten bleiben, einschließlich des Eigentümers, wenn er nur als Root ausgeführt wird.

rsync -a --no-owner --no-group --remove-source-files "$backupfile" "$destination"
Gilles 'SO - hör auf böse zu sein'
quelle
Die rsyncLösung funktioniert hervorragend. Ich hatte Mühe, meine alte Ubuntu-Installation von der CIFS-Freigabe zu übertragen. Mein rsync meldete keinen Fehler beim Verschieben der Datei, aber nicht beim Verschieben und meldete nur Berechtigungsprobleme.
Sridhar Sarnobat
+1 zur rsyncLösung!
MikeSchinkel