Quand je tape quelque chose comme:
find . -name *foo* | ls -lah
elle renvoie le même résultat qu'une ls
commande ordinaire , comme si elle n'avait pas d'entrée.
Pourtant:
ls -lah $( find . -name *foo* )
fonctionne bien, mais uniquement lorsque la find
commande a des résultats.
Est-il possible de diriger vers ls
?
bash
command-line
ls
pipe
Lasall
la source
la source
Réponses:
Vous pouvez utiliser
-exec
avec lafind
commande.la source
find . -name '*foo*' -exec ls -lah {} +
Cela devrait fonctionner.
la source
-exec +
(ou-exec \;
).xargs
est uniquement sûr à utiliser avec l'-0
option, ce qui signifie que vous devez indiquer à la commande que vous dirigezxargs
pour délimiter les éléments avec NULL-octets (\ 0). Avecfind
vous pouvez le faire avec-print0
. xargs -0 et find -print0 ne sont pas standard, mais -exec l'est, donc si la portabilité est un problème, utilisez find avec -exec.Essaye ça:
la source
Utilisez ceci: (ls peut trier, fonctionne avec des noms de fichiers avec des espaces ou des caractères inhabituels)
find . -name *foo* -print0 | xargs -0 ls -lah
"-print0" signifie que les noms de fichiers comme ceux
file foo 1
qui obtiendront la sortie defind
suivis de null. L'argument "-0" de xargs lui indique d'attendre ce type d'entrée, donc les noms de fichiers avec des espaces sontls
correctement dirigés vers la commande.À
xargs
certains égards, la construction est meilleure quefind etc -exec ls {} \;
parce que tous les noms de fichiers sont envoyésls
en même temps, donc si vous voulez tous les trier par horodatage (en utilisantls
), quelque chose comme ça fonctionne:find . -iname *pdf -print0 | xargs -0 ls -ltr
Sur un système NetBSD, "-printx" est également une option (cela me semble un argument utile, mais peu importe, nous avons xargs -0 et ça va):
find . -name *foo* -printx | xargs ls -lah
(pas pour Ubuntu)la source