web-dev-qa-db-fra.com

Comment puis-je diriger une entrée de tuyau vers la commande ls?

Quand je tape quelque chose comme:

find . -name *foo* | ls -lah

il renvoie le même résultat qu'une commande plain ls, comme si elle n'avait aucune entrée.

Toutefois:

ls -lah $( find . -name *foo* )

fonctionne bien, mais uniquement lorsque la commande find a des résultats.

Est-il possible de canaliser vers ls?

20
Lasall

Vous pouvez utiliser -exec avec la commande find.

find . -name '*foo*' -exec ls -lah {} \;
25
find . -name *foo* | xargs -r ls -lah

Cela devrait fonctionner.

20
freethinker

Utilisez ceci: (ls peut trier, travaille 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 tels que file foo 1 obtiendront une sortie de find suivie de null. L'argument "-0" de xargs lui indique d'attendre ce type d'entrée. Par conséquent, les noms de fichiers contenant des espaces sont correctement acheminés vers la commande ls.

La construction xargs est, à certains égards, meilleure que find etc -exec ls {} \; car tous les noms de fichiers sont envoyés à ls en une fois. Par conséquent, si vous voulez tous les trier par horodatage (en utilisant ls), voici ce qui 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 c'est correct):

find . -name *foo* -printx | xargs ls -lah (pas pour Ubuntu)

3
Peter Kay

Essaye ça:

find  . -name *.bak -ls
3
Dennis