Posts Tagged find

Suma rozmiaru wybranych plików w drzewie katalogów

Mały wpis ku pamięci: jak policzyć, ile miejsca zajmują w danym drzewie katalogów pliki z wybranymi rozszerzeniami.

W moim przypadku chciałem się dowiedzieć, ile miejsca zajmują filmy rodzinne. Pierwszym krokiem będzie odszukanie wszystkich filmów:

find ~/ZDJECIA -iregex ".*\.\(mp4\|mpeg\|avi\|3gp\|mov\)"

Zamiast używać standardowej konstrukcji -name użyłem wyrażenia regularnego. Pozwoliło ona na dużo bardziej zwarte umieszczenie wszystkich rozszerzeń, które mnie interesują.

Teraz wypada wyświetlić informację, ile miejsca zajmuje każdy z plików. Można to tego użyć opcji -exec w połączeniu z wywołaniem polecenia ls, ale dużo lepszy efekt da użycie przełącznika -ls. Efekt będzie podobny, a całość będzie funkcjonować dużo szybciej.

find ~/ZDJECIA -iregex ".*\.\(mp4\|mpeg\|avi\|3gp\|mov\)" -ls

Ostatnim elementem będzie wyciągnięcie kolumny z wielkością pliku i jej zsumowanie, można to zrobić przy użyciu polecenia awk:

find -iregex ".*\.\(mp4\|mpeg\|avi\|3gp\|mov\)" -ls | awk '{suma += $7} END {print suma}'

I to w sumie rozwiązuje problem.

Ja jeszcze tylko chciałem mieć wielkość plików wyświetlaną w megabajtach. Można sobie do przeliczyć używając nawet zwykłego polecenia echo, chociaż spada drastycznie czytelność kodu i tworzy się taki potworek:

echo $(($(find -iregex ".*\.\(mp4\|mpeg\|avi\|3gp\|mov\)" -ls | awk '{suma += $7} END {print suma}')/1024/1024)) MB

Tags: , ,

Kopiowanie wybranych plików z zachowaniem struktury katalogów

Stanąłem przed następującym problem: w znaleźć wszystkie pliki spełniające wybrane kryteria i skopiować je na inny udział dyskowy wraz z zachowaniem ich struktury katalogów.

Do odszukanie wszystkich wybranych plików można użyć polecenia find i można na wyszukanych plikach użyć dowolnej komendy, np cp:

find -name '*.html' -exec cp {} /mnt/kopia \;

Niestety, rozwiązanie takie nie sprawdzi się w mojej sytuacji, nie odwzoruje struktury katalogów.

Z pomocą może przyjść polecenie cpio. Polecenie to jest pewnego rodzaju odpowiednikiem komendy tar i jest używane np. przy tworzeniu archiwów RPM. Wywołanie, które pozwoli odwzorować strukturę katalogów kopiowanych plików:

find -name '*.html' -print | cpio -pdv /mnt/kopia

Poszczególne opcje komendy oznaczają:

  • -p – powoduje, że lista plików zostanie odczytana ze standardowego wejścia i następnie zostaną one skopiowane do wybranego katalogu
  • -d – w razie potrzeby tworzy strukturę katalogów
  • -v – na wyjściu błędu wypisuje informacje o kopiowanych plikach

Aktualizacja:

Można także napotkać następujący problem: nazwy plików zawierają znaki nietypowe, takie jak spacje, znaki tabulacji. Znaki te są używane przez powłokę do podziału linii poleceń na argumenty i sprawiają często problemy podczas kopiowania. W tym przypadku najprościej będzie skorzystanie z ciągów znaków zakończonych znakiem \0. Należy tylko poinformować o tym zarówno polecenie find jak i cpio:

find -name '*.html' -print0 | cpio -0 -pdv /mnt/kopia

Więcej informacji można znaleźć w dokumentacji do polecenia.

Źródła

Tags: , , ,