Come posso indirizzare un input di pipe al comando ls?


20

Quando scrivo qualcosa del tipo:

find . -name *foo* | ls -lah

restituisce lo stesso risultato di un lscomando semplice , come se non avesse input.

Tuttavia:

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

funziona bene, ma solo quando il findcomando ha risultati.

È possibile eseguire il pipe a ls?


È necessario specificare se si desidera inserire i file all'interno di ogni risultato di ricerca o se si desidera direttamente i risultati di ricerca. Se è quest'ultimo, allora la risposta di u / Dennis è la risposta corretta.
rmutalik,

Risposte:


27

Puoi usare -execcon il findcomando.

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

Grazie per la tua soluzione Non c'è pipa ma è un metodo elegante. Se non vengono trovati risultati con 'trova', non viene visualizzato nulla (ciò che è effettivamente buono).
Lasall,

7
Un modo leggermente migliore:find . -name '*foo*' -exec ls -lah {} +
jlliagre

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

Dovrebbe funzionare.


1
Grazie per quella soluzione. Ma come posso gestire gli spazi bianchi?
Lasall,

2
@Il metodo preferito è utilizzare find -exec +(o -exec \;). xargsè sicuro da usare solo con l' -0opzione, il che significa che devi dire qualunque comando tu stia xargsper delimitare gli elementi con NULL-byte (\ 0). Con findte puoi farlo con -print0. -0 di xargs e -print0 di find non sono standard, ma lo è -exec, quindi se la portabilità è sempre un problema, usa find con -exec.
geirha,


3

Usa questo: (ls può ordinare, funziona con nomi di file con spazi o caratteri insoliti)

find . -name *foo* -print0 | xargs -0 ls -lah

"-print0" significa che i nomi di file come file foo 1otterranno l'output findseguito da null. L'argomento "-0" di xargs dice che si aspetta questo tipo di input, quindi i nomi di file con spazi vengono reindirizzati lscorrettamente al comando.

La xargscostruzione è in qualche modo migliore rispetto al find etc -exec ls {} \;fatto che tutti i nomi dei file vengono inviati lscontemporaneamente, quindi se vuoi ordinarli tutti in base al timestamp (usando ls), qualcosa del genere funziona:

find . -iname *pdf -print0 | xargs -0 ls -ltr

Su un sistema NetBSD, "-printx" è anche un'opzione (questo mi sembra un argomento utile, ma comunque, abbiamo xargs -0 ed è ok):

find . -name *foo* -printx | xargs ls -lah (non per Ubuntu)


Questo ha fatto il trucco per me per essere in grado di utilizzare effettivamente le funzioni di ordinamento di ls, per coloro che cercano di farlo.
Harry Mustoe-Playfair,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.