Próbuję określić rozmiar plików, które zostaną nowo skopiowane podczas synchronizacji dwóch folderów, uruchamiając rsync w trybie suchym, a następnie sumując rozmiary plików wymienionych na wyjściu rsync.
Obecnie utknąłem przy prefiksowaniu plików według ich folderu nadrzędnego. Dowiedziałem się, jak prefiksować linie za pomocą sed i jak uciec za pomocą sed, ale mam problemy z połączeniem tych dwóch.
Oto jak daleko doszedłem:
source="/my/source/folder/"
target="/my/target/folder/"
escaped=`echo "$source" | sed -e 's/[\/&]/\\//g'`
du `rsync -ahnv $source $target | tail -n +2 | head -n -3 | sed "s/^/$escaped/"` | awk '{i+=$1} END {print i}'
To jest wynik, który otrzymuję z bash -x myscript.sh
+ source=/my/source/folder/
+ target=/my/target/folder
++ echo /my/source/folder/
++ sed -e 's/[\/&]/\//g'
+ escaped=/my/source/folder/
+ awk '{i+=$1} END {print i}'
++ rsync -ahnv /my/source/folder/ /my/target/folder/
++ sed 's/^//my/source/folder//'
++ head -n -3
++ tail -n +2
sed: -e expression #1, char 8: unknown option to `s'
+ du
80268
Wszelkie pomysły, jak właściwie uciec, będą bardzo mile widziane.
Jeśli próbujesz zsumować dane, prawdopodobnie zechcesz pominąć wszystkie możliwe podkatalogi. Może to nie mieć zastosowania, ale zawsze najlepiej jest unikać dziwności. Oto mój katalog źródłowy. Wszystkie te pliki zostały utworzone za pomocą dotyku, więc zajmują 0 miejsca.
Nie powinieneś uciekać nigdzie tak blisko, jak to robisz. Blok sed w tym miejscu wykona następujące czynności:
1d; usuń pierwszy wiersz „wysyłania przyrostowej listy plików”
/ ^ $ /, $ d; usuń pusty wiersz oznaczający koniec listy plików i wszystko po nim.
// $ / d usuń dowolny wiersz kończący się na „/”, który byłby katalogiem
Zauważ, że możesz uciec przed ukośnikami za pomocą ukośników odwrotnych (aby odpowiedzieć na aktualne pytanie).
Aby uzyskać dodatkowe punkty bonusowe, możesz nawet zsumować wyniki:
Jeśli robisz to z katalogiem już w pełni zsynchronizowanym, zwróci to śmieszne wyniki:
źródło