Polecenie Linux: znajdź pliki i uruchom na nich polecenie

16

Jak znaleźć wszystkie pliki w katalogu i podkatalogach i uruchomić na nich polecenie?

Na przykład,

find . -type f -name "*.txt" 

znajdzie wszystkie pliki txt i:

find . -type f -name "*.txt" | gedit

wysyła go do gedit, ale w pliku tekstowym. Chcę, aby gedit otworzył wszystkie pliki tekstowe.

xyz
źródło

Odpowiedzi:

22

Możesz użyć -execflagi, aby wykonać polecenie na każdym pasującym pliku:

$ find ./ -type f -name "*.txt" -exec gedit "{}" \;

Składnia

Składnia jest nieco dziwna (więcej informacji -exec command ;na stronach podręcznika):

The string `{}' is replaced by the current file name being processed

Możesz także rozważyć -execdir, co zrobi to samo, ale wykonuje polecenie z podkatalogu zawierającego dopasowany plik (jest to na ogół preferowane).

David Cain
źródło
1
Dzięki. Widzę, że to działa. Ale co oznacza koniec („{}” \ :)? wykonać listę?
1
{}Stoi na bieżący nazwy pliku, a średnik jest właśnie zakończenia polecenia. Ukośnik odwrotny i otaczające go cudzysłowy mają jedynie na celu zapobieganie rozszerzaniu powłoki.
David Cain
5

find . -type f -name "*.txt" -print0 | xargs -0 gedit

Spoza listy
źródło
Dzięki. Widzę, że to działa. Ale co robi -print0 | xargs -0 część oznacza?
1
@xyz, możesz przeczytać o flagach dowolnego polecenia UNIX za pomocą stron man. Spróbuj man findlub man xargs, /aby wyszukać daną flagę. Dokumentacja jest dość dobra, powinna odpowiedzieć na twoje pytania.
David Cain
1
-print0wypisuje znak NULL po każdym wpisie, -0oczekuje , że wpisy zostaną rozdzielone znakiem NULL. Jest to najbezpieczniejszy sposób radzenia sobie z trudnymi nazwami.
Notinlist
I czy to nie jest trochę dziwne, że składnia nie jest gedit xargs -0 zamiast xargs -0 gedit. Widzę, że to pierwsze nie działa, ale nie rozumiem dlaczego.
3
xargs jest lepszy niż -exec ze względu na wydajność, ponieważ xargs może „grupować” szereg argumentów przed przekazaniem ich do gedit. Jeśli trzeba uruchomić gedit dla każdego pliku osobno, zamień „... -print0 | xargs -0 gedit 'z' ... -print0 | xargs -0 -i gedit {} 'xargs jest jednym z tych poleceń, takich jak find i screen, których nigdy nie wiesz, jak sobie radziłeś bez roku po tym, jak się o tym dowiesz.
arclight