J'essaie d'utiliser find -exec avec plusieurs commandes sans succès. Quelqu'un sait-il si des commandes telles que les suivantes sont possibles?
find *.txt -exec echo "$(tail -1 '{}'),$(ls '{}')" \;
Fondamentalement, j'essaie d'imprimer la dernière ligne de chaque fichier txt dans le répertoire en cours et d'imprimer à la fin de la ligne, une virgule suivie du nom de fichier.
find
page de manuel:There are unavoidable security problems surrounding use of the -exec option; you should use the -execdir option instead.
unixhelp.ed.ac.uk/CGI/man-cgi?findRéponses:
find
accepte plusieurs-exec
portions de la commande. Par exemple:Notez que dans ce cas, la deuxième commande ne s'exécutera que si la première retourne correctement, comme mentionné par @Caleb. Si vous souhaitez que les deux commandes s'exécutent indépendamment de leur succès ou échec, vous pouvez utiliser cette construction:
la source
-n
dans certaines des autres réponses pour supprimer la nouvelle ligne générée par echo, ce qui est pratique si votre deuxième commande ne produit qu'une seule ligne de sortie et que vous souhaitez qu'elles soient plus faciles à lire.la source
... -exec bash -c ...
place de... -exec sh -c ...
.{}
dans le code shell. Voir unix.stackexchange.com/questions/156008/…L'un des suivants:
la source
$0
. Essayez ceci avec "foobar" au lieu de "_":find /usr/bin -name find -exec sh -c 'echo "[$0] [$1]"' foobar {} \;
- la sortie: "[foobar] [/ usr / bin / find]".$0
c'est généralement le nom du programme (ARGV[0]
).sh -c
soit entre guillemets simples, et non en double. Sinon,$1
c'est dans la mauvaise portée.'$1'
avec des guillemets doubles tant que vous échappez à la variable ("\$1"
). Vous pouvez également échapper à d'autres personnages ("\""
).Une autre façon est la suivante:
en une seule ligne
multiple_cmd()
" - est une fonctionexport -f multiple_cmd
" - l'exportera pour que tout autre sous-shell puisse le voirfind *.txt -exec bash -c 'multiple_cmd "$0"' {} \;
" - trouver qui exécutera la fonction sur votre exempleDe cette façon, multiple_cmd peut être aussi long et complexe que vous le souhaitez.
J'espère que cela t'aides.
la source
~/aaa$ acmd() { echo x \"$1\" x; }; export -f acmd; find . -exec bash -c 'acmd {}' \;
Il existe un moyen plus simple:
Alternativement:
la source
zcat $file | wc -l
"; done fonctionne, alors merci!`
pour faire que vous utilisez des barres obliques inverses comme ceci:\`
(encore, c'est une autre bonne raison d'utiliser à la$()
place).Je ne sais pas si vous pouvez le faire avec find, mais une autre solution serait de créer un script shell et de l'exécuter avec find.
lastline.sh:
Rendre le script exécutable
Utilisation
find
:la source
La 1ère réponse de Denis est la réponse pour résoudre le problème. Mais en fait, ce n'est plus une recherche avec plusieurs commandes dans un seul exécutable comme le suggère le titre. Pour répondre à un seul exécutable avec plusieurs commandes, nous devrons chercher autre chose à résoudre. Voici un exemple:
Conserver les 10000 dernières lignes de fichiers .log qui ont été modifiés au cours des 7 derniers jours à l'aide de 1 commande exec en utilisant plusieurs références {}
1) voyez ce que la commande fera sur quels fichiers:
2) Faites-le: (notez pas plus "\>" mais seulement ">" c'est voulu)
find / -name "*.log" -a -type f -a -mtime -7 -exec sh -c "tail -10000 {} > fictmp; cat fictmp > {} ; rm fictmp" \;
la source
Grâce à Camilo Martin, j'ai pu répondre à une question connexe:
Ce que je voulais faire, c'était
qui n'a pas fonctionné. cependant,
fonctionne, alors merci!
la source
Étendre la réponse de @ Tinker,
Dans mon cas, j'avais besoin de faire un
command | command | command
intérieur-exec
pour imprimer à la fois le nom de fichier et le texte trouvé dans des fichiers contenant un certain texte.J'ai pu le faire avec:
le résultat est:
la source
/dev/null
comme deuxième argument à lagrep
commande avec un-exec
paramètre:find . -name config -type f -exec grep "bitbucket" {} /dev/null \;
devrait utiliser xargs :)
un autre (travaillant sur osx)
la source
find
- les situations où le nombre de fichiers correspondants est trop grand pour une ligne de commande.-exec
est un moyen de contourner cette limite. La tuyauterie vers un utilitaire manque cet avantage.xargs -n
existe pour choisir le nombre de correspondances par appel.xargs -n 1 foocmd
s'exécuterafoocmd {}
pour chaque match.Une
find+xargs
réponse.L'exemple ci-dessous trouve tous les
.html
fichiers et crée une copie avec l'.BAK
extension ajoutée (par exemple1.html
>1.html.BAK
).Commande unique avec plusieurs espaces réservés
Commandes multiples avec plusieurs espaces réservés
Cette commande fonctionnera également avec les fichiers qui commencent par un trait d'union ou contiennent des espaces tels que
-my file.html
grâce à la citation des paramètres et--
aprèscp
quoi signalecp
la fin des paramètres et le début des noms de fichiers réels.la source