Tak, find ./work -print0 | xargs -0 rm
wykona coś takiego rm ./work/a "work/b c" ...
. Możesz sprawdzić za pomocą echo
, find ./work -print0 | xargs -0 echo rm
wydrukuje polecenie, które zostanie wykonane (z wyjątkiem tego, że białe znaki zostaną odpowiednio zmienione, chociaż echo
nie będzie tego wyświetlać).
Aby xargs
umieścić nazwy na środku, musisz dodać -I[string]
, gdzie [string]
jest to, co chcesz zastąpić argumentem, w tym przypadku użyłbyś -I{}
np <strings.txt xargs -I{} grep {} directory/*
.
W rzeczywistości chcesz użyć grep -F -f strings.txt
:
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by
newlines, any of which is to be matched. (-F is specified by
POSIX.)
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The empty file
contains zero patterns, and therefore matches nothing. (-f is
specified by POSIX.)
Tak więc grep -Ff strings.txt subdirectory/*
znajdzie wszystkie wystąpienia dowolnego łańcucha strings.txt
jako literał, jeśli upuścisz -F
opcję, możesz użyć wyrażeń regularnych w pliku. Możesz też użyć grep -F "$(<strings.txt)" directory/*
. Jeśli chcesz ćwiczyć find
, możesz użyć dwóch ostatnich przykładów w podsumowaniu. Jeśli chcesz przeprowadzić wyszukiwanie rekurencyjne zamiast tylko pierwszego poziomu, masz kilka opcji, również w podsumowaniu.
Podsumowanie:
# grep for each string individually.
<strings.txt xargs -I{} grep {} directory/*
# grep once for everything
grep -Ff strings.txt subdirectory/*
grep -F "$(<strings.txt)" directory/*
# Same, using file
find subdirectory -maxdepth 1 -type f -exec grep -Ff strings.txt {} +
find subdirectory -maxdepth 1 -type f -print0 | xargs -0 grep -Ff strings.txt
# Recursively
grep -rFf strings.txt subdirectory
find subdirectory -type f -exec grep -Ff strings.txt {} +
find subdirectory -type f -print0 | xargs -0 grep -Ff strings.txt
Możesz użyć tej -l
opcji, aby uzyskać tylko nazwę każdego pasującego pliku, jeśli nie potrzebujesz widzieć rzeczywistej linii:
-l, --files-with-matches
Suppress normal output; instead print the name of each input
file from which output would normally have been printed. The
scanning will stop on the first match. (-l is specified by
POSIX.)