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


20

Quand je tape quelque chose comme:

find . -name *foo* | ls -lah

elle renvoie le même résultat qu'une lscommande ordinaire , comme si elle n'avait pas d'entrée.

Pourtant:

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

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

Est-il possible de diriger vers ls?


Vous devez spécifier si vous souhaitez ls les fichiers à l'intérieur de chaque résultat de recherche, ou si vous voulez ls les résultats de recherche directement. Si c'est le dernier, alors la réponse de u / Dennis est la bonne réponse.
rmutalik

Réponses:


27

Vous pouvez utiliser -execavec la findcommande.

find . -name '*foo*' -exec ls -lah {} \;

Merci pour votre solution. Il n'y a pas de pipe mais c'est une méthode élégante. S'il n'y a aucun résultat avec 'find', il n'affiche rien (ce qui est en fait bon).
Lasall

7
Une façon un peu meilleure:find . -name '*foo*' -exec ls -lah {} +
jlliagre

20
find . -name *foo* | xargs -r ls -lah

Cela devrait fonctionner.


1
Merci pour cette solution. Mais comment gérer les espaces blancs?
Lasall

2
@Lasall la meilleure façon est d'utiliser find -exec +(ou -exec \;). xargsest uniquement sûr à utiliser avec l' -0option, ce qui signifie que vous devez indiquer à la commande que vous dirigez xargspour délimiter les éléments avec NULL-octets (\ 0). Avec findvous 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.
geirha


3

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 1qui 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 sont lscorrectement dirigés vers la commande.

À xargscertains égards, la construction est meilleure que find etc -exec ls {} \;parce que tous les noms de fichiers sont envoyés lsen même temps, donc si vous voulez tous les trier par horodatage (en utilisant ls), 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)


Cela a fait l'affaire pour moi de pouvoir réellement utiliser les fonctions de tri de ls, pour ceux qui essaient de le faire.
Harry Mustoe-Playfair
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.