Ja, find ./work -print0 | xargs -0 rm
wird so etwas ausführen rm ./work/a "work/b c" ...
. Sie können mit überprüfen echo
, find ./work -print0 | xargs -0 echo rm
wird den Befehl drucken, der ausgeführt wird (außer Leerzeichen werden entsprechend maskiert, obwohl das echo
nicht zeigt).
Um xargs
die Namen in die Mitte zu setzen, müssen Sie hinzufügen -I[string]
, wo [string]
Sie durch das Argument ersetzt werden möchten, in diesem Fall würden Sie -I{}
z <strings.txt xargs -I{} grep {} directory/*
.
Was Sie tatsächlich verwenden möchten, ist 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.)
So grep -Ff strings.txt subdirectory/*
werden alle Vorkommen einer Zeichenfolge in finden strings.txt
als wörtliche, wenn Sie die Drop - -F
Option können Sie reguläre Ausdrücke in der Datei verwenden. Sie könnten auch tatsächlich verwenden grep -F "$(<strings.txt)" directory/*
. Wenn Sie üben möchten find
, können Sie die letzten beiden Beispiele in der Zusammenfassung verwenden. Wenn Sie anstelle der ersten Ebene eine rekursive Suche durchführen möchten, haben Sie auch in der Zusammenfassung einige Optionen.
Zusammenfassung:
# 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
Sie können die -l
Option verwenden, um nur den Namen jeder übereinstimmenden Datei abzurufen, wenn Sie die aktuelle Zeile nicht sehen müssen:
-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.)