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.