rsync: pomiń pliki, do których nie mam uprawnień


16

Używam rsync -rlptDdo skopiowania katalogu od innego użytkownika. Jest kilka plików (nie mam możliwości ich wcześniejszego poznania), których nie mam uprawnień do kopiowania. Czy istnieje sposób, aby rsync je zignorował. Problem polega na tym, że jeśli rsync zwróci wartość niezerową, mój skrypt bash -x zakończy działanie.


Rsync ma dobrze udokumentowane wartości wyjściowe. Nie powinieneś traktować ich wszystkich jako porażki, jeśli twoja sytuacja nie wymaga, aby była to porażka.
jordanm

@jordanm Ale nie ma kodu błędu, który byłby wystarczająco szczegółowy, aby wskazać tylko ten błąd.
Gilles „SO- przestań być zły”

Odpowiedzi:


7

Rsync nie ma na to opcji. Widzę dwa rozwiązania. Jednym z nich jest parsowanie komunikatów o błędach rsync; to nie jest bardzo solidne. Drugim jest wygenerowanie listy nieczytelnych plików do filtrowania.

cd /source/directory
exclude_file=$(mktemp)
find . ! -readable -o -type d ! -executable |
  sed -e 's:^\./:/:' -e 's:[?*\\[]:\\1:g' >>"$exclude_file"
rsync -rlptD --exclude-from="$exclude_file" . /target/directory
rm "$exclude_file"

Jeśli findnie masz -readablei -executablezastąp je odpowiednią -permdyrektywą.

Zakłada się, że nie ma nieczytelnych plików, których nazwa zawiera nowy wiersz. Jeśli musisz sobie z tym poradzić, musisz utworzyć listę plików rozdzielaną wartościami zerowymi i przekazać tę -0opcję rsync:

find . \( ! -readable -o -type d ! -executable \) -print0 |
  perl -0000 -pe 's:\A\./:/:' -e 's:[?*\\[]:$1:g' >>"$exclude_file"

To prawdopodobnie jego najlepszy zakład. Mam nadzieję, że musi to uruchomić tylko raz, ponieważ stat()dwukrotne uruchomienie każdego pliku (raz przez rsync i raz przez find) byłoby bardzo złe.
jordanm

@Gilles wydaje się, że to działa, z wyjątkiem ukrytych plików. Zakładam, że ta sama strategia będzie działać z pewnymi drobnymi poprawkami. Nie znam \! (wykrzyknik) możesz to wyjaśnić?
JeffCharter

1
@JeffC \!cytuje !operatora, aby chronić go przed rozszerzeniem powłoki. Odwrotny ukośnik nie jest tutaj konieczny, ponieważ żadna skorupa nie rozszerza się, !gdy następuje po niej spacja, ale nie boli. Co jest nie tak z ukrytymi plikami?
Gilles „SO- przestań być zły”

3

Zrobiłem proste obejście tej konkretnej sytuacji:

rsync --args || $(case "$?" in 0|23) exit 0 ;; *) exit $?; esac)

Zwraca to, 0jeśli zwrócony kod miał wartość 0 lub 23 i zwraca kod wyjścia we wszystkich innych przypadkach.

Należy jednak pamiętać, że spowoduje to zignorowanie wszystkich Partial transfer due to errorbłędów, nie tylko tych związanych z uprawnieniami , ponieważ wychwytuje wszystko, co wychodzi z kodu 23. Aby uzyskać więcej informacji o kodach stanu rsync, zapoznaj się z tym linkiem .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.