Ya, find ./work -print0 | xargs -0 rm
akan menjalankan sesuatu seperti rm ./work/a "work/b c" ...
. Anda dapat memeriksa echo
, find ./work -print0 | xargs -0 echo rm
akan mencetak perintah yang akan dieksekusi (kecuali spasi putih akan lolos dengan tepat, meskipun echo
tidak akan menunjukkan itu).
Untuk xargs
menempatkan nama di tengah, Anda perlu menambahkan -I[string]
, di mana [string]
Anda ingin diganti dengan argumen, dalam hal ini Anda akan menggunakan -I{}
, misalnya <strings.txt xargs -I{} grep {} directory/*
.
Apa yang sebenarnya ingin Anda gunakan adalah 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.)
Jadi grep -Ff strings.txt subdirectory/*
akan menemukan semua kemunculan string apa pun strings.txt
sebagai literal, jika Anda menjatuhkan -F
opsi, Anda dapat menggunakan ekspresi reguler dalam file. Anda juga bisa menggunakannya grep -F "$(<strings.txt)" directory/*
. Jika Anda ingin berlatih find
, Anda dapat menggunakan dua contoh terakhir dalam ringkasan. Jika Anda ingin melakukan pencarian rekursif, bukan hanya level pertama, Anda memiliki beberapa opsi, juga dalam ringkasan.
Ringkasan:
# 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
Anda mungkin ingin menggunakan -l
opsi untuk mendapatkan hanya nama dari setiap file yang cocok jika Anda tidak perlu melihat baris yang sebenarnya:
-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.)