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?

Lasall
la source
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 {} \;
Prince John Wesley
la source
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.

libre penseur
la source
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
4

Essaye ça:

find  . -name *.bak -ls
Dennis
la source
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)

Peter Kay
la source
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