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: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)