Możesz połączyć łańcuchowo połączenia, aby znaleźć (raz, kiedy dowiesz się, że jest to możliwe, co może być dzisiaj). Jest to oczywiście możliwe tylko tak długo, jak długo będziesz w znalezieniu. Gdy potokujesz do xargs, jest on poza zasięgiem.
Mały przykład, dwa pliki a.lst i b.lst:
cat a.lst
fuddel.sh
fiddel.sh
cat b.lst
fuddel.sh
Żadna sztuczka tutaj - po prostu fakt, że oba zawierają „fuddel”, ale tylko jeden zawiera „fiddel”.
Załóżmy, że o tym nie wiedzieliśmy. Szukamy pliku, który spełnia 2 warunki:
find -exec grep -q fuddel {} ";" -exec grep -q fiddel {} ";" -ls
192097 4 -rw-r--r-- 1 stefan stefan 20 Jun 27 17:05 ./a.lst
Cóż, być może znasz składnię grep lub innego programu, aby przekazać oba ciągi jako warunek, ale nie o to chodzi. Można tutaj użyć każdego programu, który może zwrócić wartość true lub false, podając plik jako argument - grep był tylko popularnym przykładem.
I pamiętaj, że możesz znaleźć find -exec za pomocą innych poleceń find, takich jak -ls lub -delete lub coś podobnego. Zauważ, że usunięcie nie tylko robi rm (usuwa pliki), ale także rmdir (usuwa katalogi).
Taki łańcuch jest odczytywany jako kombinacja ORAZ, o ile nie określono inaczej (mianowicie -or
przełącznikiem (i parenami (które wymagają maskowania))).
Więc nie opuszczasz łańcucha wyszukiwania, co jest przydatne. Nie widzę żadnej korzyści z używania -xargs, ponieważ musisz uważać na przekazywanie plików, co jest czymś, czego nie trzeba robić - automatycznie obsługuje przekazywanie każdego pliku jako pojedynczego argumentu.
Jeśli uważasz, że potrzebujesz maskowania dla znalezionych aparatów ortodontycznych {} , odwiedź moje pytanie, które wymaga dowodów. Moje twierdzenie brzmi: nie.
find
. Wielkie dzięki!-exec
zrobićxargs -P4
, aby trzy z czterech rdzeni nie pozostawały bezczynne?Bezpieczne przesyłanie nazw plików do
xargs
wymaga, abyśfind
obsługiwał tę-print0
opcję i abyśxargs
miał odpowiednią opcję jej odczytania (--null
lub-0
). W przeciwnym razie nazwy plików z niedrukowalnymi znakami lub ukośnikami odwrotnymi lub cudzysłowami lub białymi znakami w nazwie mogą powodować nieoczekiwane zachowanie. Z drugiej stronyfind -exec {} +
jest w specyfikacji POSIXfind
, więc jest przenośny i jest tak bezpieczny, jakfind -print0 | xargs -0
i zdecydowanie bezpieczniejszy niżfind | xargs
. Polecam nigdy niefind | xargs
obejść się bez-print0
.źródło
find … -exec … {} +
jest OpenBSD, który nabył tę funkcję dopiero w wersji 5.1 wydanej w 2012 roku. Wszystkie BSD mają już-print0
od kilku lat, nawet OpenBSD (choć przez pewien czas opierała się tej funkcji). Z drugiej strony Solaris trzyma się funkcji POSIX, więc dostajesz-exec +
i nie-print0
.-print0
jest bólem i chociaż można argumentowaćxargs --delimiter "\n"
, że nie jest równoważny, nigdy nie użyłem tego pierwszego po odkryciu drugiego.-0
to jest bardziej niż ból--delimiter "\n"
.-0
GNUxargs
musi-r
unikać uruchamiania polecenia, jeśli nie ma danych wejściowych.| xargs -r0 cmd
jest to, żecmd
ma to wpływ na standardowexargs
/dev/null
Jeśli używasz
-exec ... ;
formularza (pamiętaj, aby uciec do średnika), uruchamiasz polecenie raz na nazwę pliku. Jeśli używasz-print0 | xargs -0
, uruchamiasz wiele poleceń na nazwę pliku. Zdecydowanie powinieneś użyć-exec +
formularza, który umieszcza wiele plików w jednym wierszu poleceń i jest znacznie szybszy, gdy zaangażowana jest duża liczba plików.Dużym plusem używania
xargs
jest możliwość uruchamiania wielu poleceń jednocześniexargs -P
. W systemach wielordzeniowych może to zapewnić ogromne oszczędności czasu.źródło
-P
zamiast-p
. Pamiętajxargs -P
, że nie ma go w standardzie POSIX, alefind -exec {} +
jest, co jest ważne, jeśli zamierzasz być przenośny.find /tmp/ -exec ls "{}" +
działa dobrze.-exec
(jestem masochistą, nawet nie używam cudzysłowów do ucieczki{}
, zawsze piszę\{\}
; nie pytaj), wszystko wygląda na to, że trzeba teraz uciec.find /tmp/ -exec ls {} +
nie działałoby.bash
zacząłem przyjmować aparat ortodontyczny dosłownie. Jestem prawie pewien, że przynajmniej jedna ze starych pocisków, którą użyłem, rzuciła syczące ataki, jeśli aparat nie uciekł.Jeśli chodzi o wydajność, pomyślałem, że
-exec … +
byłoby to po prostu lepsze, ponieważ jest to pojedyncze narzędzie, które wykonuje całą pracę, ale część dokumentacji GNU findutil mówi,-exec … +
że w niektórych przypadkach może być mniej wydajna:Nie byłem do końca pewien, co to znaczy, więc zapytałem na czacie, gdzie derobert wyjaśnił to jako:
(Formatowanie przeze mnie.)
Więc to jest to. Ale jeśli wydajność naprawdę ma znaczenie, musisz przeprowadzić realistyczne testy porównawcze, a nawet zadać sobie pytanie, czy w takich przypadkach chcesz użyć powłoki.
Tutaj, na tej stronie, myślę, że lepiej doradzać ludziom korzystanie z
-exec … +
formularza, gdy tylko jest to możliwe, ponieważ tylko dlatego, że jest prostszy i z powodów wymienionych w innych odpowiedziach tutaj (np. Radzenie sobie z dziwnymi nazwami plików bez konieczności długiego myślenia).źródło