Jak przenieść plik bez zachowania uprawnień

42

Problem polega na tym, że chcę widzieć błędy podczas przenoszenia pliku, ale nie widzę błędów związanych z problemem uprawnień. Innymi słowy - zależy mi, czy plik nie zostanie w pełni przesłany, ale nie chcę widzieć takich błędów:

mv: nie udało się zachować własności dla `/home/blah/backup/pgsql.tar.gz ': Operacja niedozwolona

Więc chcę coś takiego: mv $backupfile $destination --ignore-permissions.

Plik kopii zapasowej może mieć rozmiar od 1 MiB do 5 GiB i jest przesyłany przez NFS.

Nux
źródło
Dzieje się tak również na podłączonym urządzeniu NTFS, ale nie jest to jedyny przypadek. Zdarza się to we wszystkich przypadkach, w których nie masz uprawnień do zmiany uprawnień lub nie jest to możliwe (jak w NTFS).
Nux
Jest to przydatne, gdy próbujesz przenieść pliki, które w jakiś sposób nie zostaną przeniesione z powodu błędów uprawnień (np. Ponieważ są zamontowane cifs).
Sridhar Sarnobat

Odpowiedzi:

56

mvjest niewłaściwym narzędziem do tego zadania; chcesz cpi wtedy rm. Ponieważ przenosisz plik do innego systemu plików, i tak właśnie dzieje się mvto za kulisami, ale oprócz tego mvpróbuje również zachować bity uprawnień do plików oraz informacje o właścicielu / grupie. Jest tak, ponieważ mvzachowałby te informacje, gdyby przenosił plik w tym samym systemie plików i mvpróbował zachowywać się w ten sam sposób w obu sytuacjach. Ponieważ nie zależy Ci na zachowaniu bitów uprawnień do plików oraz informacji o właścicielu / grupie, nie używaj tego narzędzia. Użyj cp --no-preserve=modei rmzamiast.

Kyle Jones
źródło
5
Dzięki, działa. Skończyło się to: cp --no-preserve=mode,ownership $backupfile $destinationsprawdź kod wyjścia, a następnie zrób, rm $backupfilejeśli wszystko jest w porządku.
Nux
22

Gdy przenosisz plik w tym samym systemie plików, mvodłącza on plik od jego starej lokalizacji i dołącza go do nowej lokalizacji; metadane, takie jak uprawnienia, pozostają takie same. Gdy przenosisz plik do innego systemu plików, mvkopiuje go, próbuje replikować jak najwięcej metadanych, jak to możliwe, i usuwa oryginał.

Ponieważ przenosisz się do innego systemu plików i nie chcesz replikować dużej ilości metadanych, równie dobrze możesz skopiować plik, a następnie usunąć oryginał.

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

Zachowuje to do pewnego stopnia uprawnienia do pliku (np. Czytelność na świecie, wykonywalność). Czas modyfikacji pliku nie jest zachowywany. Dzięki GNUcp możesz użyć --preserve=…opcji, aby lepiej kontrolować, które metadane są replikowane dokładniej, np --preserve=mode,timestamps.

Możesz także użyć rsynci powiedzieć, co chcesz zachować. Ta opcja -aoznacza „zachowaj większość metadanych”, w tym właściciela, jeśli działa tylko jako root.

rsync -a --no-owner --no-group --remove-source-files "$backupfile" "$destination"
Gilles „SO- przestań być zły”
źródło
rsyncRozwiązanie działa doskonale. Próbowałem przenieść moją starą instalację Ubuntu z udziału CIFS. Mój rsync nie zgłosił niepowodzenia przenoszenia pliku, ale go nie przenosił i tylko zgłaszał problemy z uprawnieniami.
Sridhar Sarnobat
+1 za rsyncrozwiązanie!
MikeSchinkel