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