MC, 17:16 poniedziałek, 01.04.2013 r.
Ilustracja do artykułu: find exec Linux - Jak rekurencyjnie przenieść pliki i danym rozszerzeniu

find exec Linux - Jak rekurencyjnie przenieść pliki i danym rozszerzeniu

Na łamach strony zdarzało mi się już kilkukrotnie pisać na temat zastosowań polecenia find. Ten wpis będzie kolejnym dowodem na to, że nie sposób wymienić je wszystkie, a mówiąc konkretniej, pokażę jak w prosty sposób rekursywnie przenieść pliki o danym rozszerzeniu do wskazanej lokacji.

A po co rekursywnie przenosić pliki?

Przykładowe odpowiedzi na tak postawione pytanie można by mnożyć, wyobraźmy sobie jednak, że mamy w różnych katalogach swojego konta użytkownika, wiele plików graficznych, dajmy na to tapet i chcemy w końcu zrobić z nimi porządek, przenosząc je do jednego katalogu o nazwie Tapety. Oczywiście można mieć do tego przykładu kilka uwag, ale przede wszystkim chodzi o ideę. Jak to często powtarzam, praca z komputerem powinna wyglądać tak, że to on pracuje za nas, więc o ręcznym robieniu porządków, w tym wypadku nie ma mowy - spróbujemy zaprząc do tego zadania polecenie find.

Właściwie, dlaczego find?

Jeżeli ktoś zastanawia się, dlaczego właściwie nie użyć polecenia mv, służącego do przenoszenia plików, a w zamian tego chcemy korzystać z find, to już śpieszę z odpowiedzią. Po pierwsze, to użyjemy mv, ale nie w sposób bezpośredni. Po drugie i najważniejsze, to nie możemy użyć go bezpośrednio, ponieważ mv nie działa w sposób rekursywny i odnosi się jedynie do zawartości zerowego poziomu wskazanego katalogu. Z tego powodu, przy pomocy polecenia find uzyskamy ścieżki do plików spełniające nasze wymagania (ze wskazanego katalogu i wszystkich jego podkatalogów), a następnie przekażemy te ścieżki do polecenia mv, które wykona właściwą operację przenosin pliku. Może brzmi to nieco skomplikowanie, ale to tylko pozory, ponieważ całość ogranicza się do jednego polecenia:
find . -name *.png -exec mv {} ~/Tapety \;

Jedno polecenie a w dodatku całkiem proste. Przeszukujemy katalog, w którym obecnie znajdujemy się w konsoli (w powyższym poleceniu odpowiada za to "."), następnie wybieramy jedynie pliki, których nazwa kończy się rozszerzeniem *.png (oczywiście można stawiać dowolnie inne warunki), a następnie wykonujemy inne polecenie, w tym wypadku mv. Kiedyś już wspominałem o składni polecenia "zagnieżdżonego" w argument -exec, ale wspomnę ponownie, że {} oznacza ścieżkę uzyskaną przez find, a \; oznacza jedynie zakończenie polecenia "zagnieżdżonego".

Jak widzimy rekursywne przenoszenie plików z wykorzystaniem polecenia find, nie jest niczym trudnym do wykonania.

Komentarze (2)

Imię:
Treść:
Administrator 2018-06-08 09:32:07
@growmen, polecenie z artykułu powinno wybrać i przenieść również te pliki, które znajdują się w podkatalogach. Jeśli jednak zależy Ci na tym, żeby tę strukturę katalogów w nowym miejscu zachować, to polecam zapoznać się z poleceniem rsync (zdaje mi się, że ono będzie najodpowiedniejsze do takiego problemu) - opis programu rsync.
growmen 2018-06-07 22:21:50
czy dałoby się "przystosować" tą składnię do plików znajdujacych się w podkatalogach danego katalogu?