Vâng, find ./work -print0 | xargs -0 rm
sẽ thực hiện một cái gì đó như rm ./work/a "work/b c" ...
. Bạn có thể kiểm tra với echo
, find ./work -print0 | xargs -0 echo rm
sẽ in lệnh sẽ được thực thi (ngoại trừ khoảng trắng sẽ được thoát một cách thích hợp, mặc dù điều đó echo
sẽ không hiển thị điều đó).
Để xargs
đặt tên ở giữa, bạn cần thêm -I[string]
, đâu [string]
là thứ bạn muốn được thay thế bằng đối số, trong trường hợp này bạn sử dụng -I{}
, vd <strings.txt xargs -I{} grep {} directory/*
.
Những gì bạn thực sự muốn sử dụng là 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.)
Vì vậy, grep -Ff strings.txt subdirectory/*
sẽ tìm thấy tất cả các lần xuất hiện của bất kỳ chuỗi nào strings.txt
dưới dạng bằng chữ, nếu bạn bỏ -F
tùy chọn, bạn có thể sử dụng các biểu thức thông thường trong tệp. Bạn thực sự có thể sử dụng grep -F "$(<strings.txt)" directory/*
quá. Nếu bạn muốn thực hành find
, bạn có thể sử dụng hai ví dụ cuối cùng trong bản tóm tắt. Nếu bạn muốn thực hiện tìm kiếm đệ quy thay vì chỉ cấp độ đầu tiên, bạn có một vài tùy chọn, cũng trong bản tóm tắt.
Tóm lược:
# 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
Bạn có thể muốn sử dụng -l
tùy chọn để chỉ lấy tên của từng tệp phù hợp nếu bạn không cần phải xem dòng thực tế:
-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.)