Oui, find ./work -print0 | xargs -0 rm
exécutera quelque chose comme rm ./work/a "work/b c" ...
. Vous pouvez vérifier avec echo
, find ./work -print0 | xargs -0 echo rm
affichera la commande qui sera exécutée (sauf que l'espace blanc sera échappé de manière appropriée, bien que echo
cela ne le montre pas).
Pour arriver xargs
à mettre les noms au milieu, vous devez ajouter -I[string]
, où [string]
est ce que vous voulez remplacer par l'argument, dans ce cas, vous utiliseriez -I{}
, par exemple <strings.txt xargs -I{} grep {} directory/*
.
Ce que vous voulez réellement utiliser, c'est 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.)
Ainsi grep -Ff strings.txt subdirectory/*
, toutes les occurrences de n'importe quelle chaîne seront trouvées en strings.txt
tant que littéral, si vous supprimez l' -F
option, vous pouvez utiliser des expressions régulières dans le fichier. Vous pouvez grep -F "$(<strings.txt)" directory/*
également l' utiliser . Si vous voulez vous entraîner find
, vous pouvez utiliser les deux derniers exemples du résumé. Si vous souhaitez effectuer une recherche récursive au lieu du premier niveau uniquement, vous disposez de quelques options, également dans le résumé.
Sommaire:
# 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
Vous pouvez utiliser l' -l
option pour obtenir uniquement le nom de chaque fichier correspondant si vous n'avez pas besoin de voir la ligne réelle:
-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.)