Comment exécuter une commande spécifique pour chaque fichier trouvé à l'aide de la find
commande? Aux fins de la question, disons que je voudrais simplement supprimer chaque fichier trouvé par find
.
la source
Comment exécuter une commande spécifique pour chaque fichier trouvé à l'aide de la find
commande? Aux fins de la question, disons que je voudrais simplement supprimer chaque fichier trouvé par find
.
Edit: Bien que la réponse suivante explique le cas d'utilisation général, il convient de noter que la suppression de fichiers et de répertoires est un cas particulier. Au lieu d'utiliser la -execdir rm {} \;
construction, utilisez simplement -delete
, comme dans:
find -iname '*.txt' -delete
Cela gère un grand nombre de cas marginaux auxquels vous pourriez ne pas penser, notamment d'inclure les fichiers de commande et les répertoires à supprimer pour ne pas générer d'erreur. Pour d'autres cas d'utilisation ...
Le meilleur moyen de gérer les commandes en cours d'exécution des résultats d'une recherche consiste généralement à utiliser les différentes -exec
options de la find
commande. En particulier, vous devriez essayer d’utiliser -execdir
autant que possible, car il se trouve dans le répertoire du fichier qui a été trouvé et est généralement plus sûr (dans le sens d’empêcher que des erreurs stupides soient désastreuses) par rapport aux autres options.
Les -exec
options sont suivies de la commande avec laquelle vous souhaitez exécuter {}
indiquant le point où le fichier trouvé par find doit être inclus et sont terminées par \;
exécuter la commande une fois pour chaque fichier ou +
remplacer {}
par une liste d'arguments de toutes les correspondances. . Notez que le point-virgule de terminaison est échappé de sorte que le shell ne le comprend pas comme un séparateur menant à une nouvelle commande.
Disons que vous avez trouvé tous les fichiers texte:
find -iname '*.txt' -execdir rm {} \;
Voici le bit pertinent du manuel de recherche ( man find
):
-exec command ;
Execute command; true if 0 status is returned. All following
arguments to find are taken to be arguments to the command until
an argument consisting of ‘;’ is encountered. The string ‘{}’
is replaced by the current file name being processed everywhere
it occurs in the arguments to the command, not just in arguments
where it is alone, as in some versions of find. Both of these
constructions might need to be escaped (with a ‘\’) or quoted to
protect them from expansion by the shell. See the EXAMPLES sec-
tion for examples of the use of the -exec option. The specified
command is run once for each matched file. The command is exe-
cuted in the starting directory. There are unavoidable secu-
rity problems surrounding use of the -exec action; you should
use the -execdir option instead.
-exec command {} +
This variant of the -exec action runs the specified command on
the selected files, but the command line is built by appending
each selected file name at the end; the total number of invoca-
tions of the command will be much less than the number of
matched files. The command line is built in much the same way
that xargs builds its command lines. Only one instance of ‘{}’
is allowed within the command. The command is executed in the
starting directory.
-execdir command ;
-execdir command {} +
Like -exec, but the specified command is run from the subdirec-
tory containing the matched file, which is not normally the
directory in which you started find. This a much more secure
method for invoking commands, as it avoids race conditions dur-
ing resolution of the paths to the matched files. As with the
-exec action, the ‘+’ form of -execdir will build a command line
to process more than one matched file, but any given invocation
of command will only list files that exist in the same subdirec-
tory. If you use this option, you must ensure that your $PATH
environment variable does not reference ‘.’; otherwise, an
attacker can run any commands they like by leaving an appropri-
ately-named file in a directory in which you will run -execdir.
The same applies to having entries in $PATH which are empty or
which are not absolute directory names.
Une alternative consiste à diriger la sortie et à l’analyser avec les commandes suivantes. Le seul moyen sûr de le faire est d'utiliser l'
-print0
option, qui indiquefind
d'utiliser un caractère nul comme délimiteur de résultats. Les commandes de réception doivent avoir la capacité de reconnaître une entrée délimitée par un zéro. Exemple:Notez que l'
-0
option indiquexargs
de traiter l'entrée comme délimitée par null.la source
-exec
utiliser plus de fichiers si vous le terminez au+
lieu de;
. Voir la réponse de caleb.Find a une commande de suppression intégrée si c'est tout ce que vous devez faire.
find . -name "*.txt" -delete
Tout fichier .txt trouvé sera supprimé à l'aide de la commande ci-dessus.
la source
Je cherchais une réponse à cette question et je suis tombé sur ce fil. Les réponses m'ont donné une idée sur la façon dont je pourrais y arriver. Supposons que vous souhaitiez trouver le
mediainfo
fichier JPEGCela ajouterait
mediainfo "
au début et"
à la fin de chaque fichier correspondant (pour éviter autant que possible les caractères spéciaux), mettez-le dans un script et exécutez-le:Si vous craignez que quelque chose ne se passe pas bien, vous pouvez éviter de rediriger la sortie vers un fichier et simplement voir le résultat dans le terminal avant d'exécuter le script.
la source
Vous pouvez accomplir cela en utilisant la
xargs
commande.xargs
exécute essentiellement une commande une fois pour chaque instruction de son entrée standard. Donc, si vous avez besoin de supprimer tous les.jpg
fichiers d'un répertoire par exemple, voici une méthode rapide:Vous pouvez également utiliser le backtick (au-dessus du bouton Tab) pour le faire (notez qu'il s'agit du caractère backquote et non du guillemet simple):
Notez qu'en raison de la manière dont les
xargs
shells traitent leur entrée, la méthode xargs ne fonctionne que si aucun des noms de fichier et de répertoire impliqués ne contient d'espaces ni aucun\"'
; la méthode backquote ne fonctionne que si aucun des noms de fichier et de répertoire impliqués ne contient d’espace ou d’espace vide\[?*
.la source
find
, ce qui-exec
est généralement une meilleure solution. Si vous souhaitez les spécifier en tant que substituts, expliquez au moins comment utiliser cette fonctionfind -print0 | xargs -0
pour gérer en toute sécurité les ruptures de noms de fichiers et expliquez-leur quand il convient de faire attention aux backticks.