Так, find ./work -print0 | xargs -0 rm
виконають щось на кшталт rm ./work/a "work/b c" ...
. Ви можете перевірити echo
, find ./work -print0 | xargs -0 echo rm
надрукує команду, яка буде виконуватися (за винятком білого простору, не буде відповідним чином, хоча це echo
не покаже).
Щоб xargs
поставити імена в середину, вам потрібно додати -I[string]
, де [string]
саме те, що ви хочете замінити аргументом, у цьому випадку ви б використовували -I{}
, наприклад <strings.txt xargs -I{} grep {} directory/*
.
Що ви насправді хочете використовувати 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.)
Так grep -Ff strings.txt subdirectory/*
ви знайдете всі входження будь-якого рядка в strings.txt
буквальному значенні, якщо ви випадете з цього -F
параметра, ви можете використовувати регулярні вирази у файлі. Насправді ви також можете використовувати grep -F "$(<strings.txt)" directory/*
. Якщо ви хочете попрактикуватися find
, ви можете використовувати останні два приклади у резюме. Якщо ви хочете зробити рекурсивний пошук замість лише першого рівня, у вас є кілька варіантів, також у резюме.
Підсумок:
# 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
Ви можете скористатися -l
опцією, щоб отримати лише ім’я кожного відповідного файлу, якщо вам не потрібно бачити фактичний рядок:
-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.)