Come posso restituire solo i nomi dei file dal comando find?


13

Sto cercando di ottenere un elenco di soli nomi di file (senza il resto del percorso) quando eseguo il comando find da un terminale. Come realizzo questo sul Mac?

Risposte:



6

Evilsoup ha affermato che ciò che è stato pubblicato non funziona per i nomi di file distanziati. Quindi invece potresti usare:

find . -type f -print0 | while IFS= read -r -d '' filename; do echo ${filename##*/}; done

Questo si interromperà sui file con spazi nei loro nomi (vedi analisi di ls sul wiki di Greg)
evilsoup,

+1 per la velocità. Non so se ho fatto qualcosa di sbagliato, ma questo ha richiesto 1 secondo sul mio $ HOME, mentre tutti gli altri hanno impiegato circa 10 secondi. Certo, avrei bisogno di più di 10 secondi per cercare questo e scriverlo.
Paulo Almeida,

2

Con GNU find, puoi fare:

 find ~/tmp/ -printf "%f\n"

Probabilmente vale la pena provare anche in OS X.


2
-printfnon è supportato su BSD di OS X find.
Daniel Beck

1
Inoltre, -printfha poca relazione con l' printfutilità di shell C o POSIX printf. L'uso di questo nome di funzione storica per qualcosa di diverso è molto poco considerato. I ragazzi conservatori della BSD probabilmente la vedranno allo stesso modo, quindi probabilmente non vedremo il clone -printfnella ricerca della BSD, sotto quel nome.
Kaz,

Non sono d'accordo sul fatto che sia scarsamente considerato l'utilizzo di un nome di funzione familiare per eseguire un'attività simile in un contesto diverso. Perché BSD probabilmente non lo supporterà mai è un'altra questione.
Ярослав Рахматуллин,

2

C'è un modo migliore per eliminare tutto tranne l'ultima parte del percorso di un file; con awk. È meglio perché awk non viene eseguito una volta per ogni file. In alcuni casi questo è importante.

find ~/tmp/ -type f  | awk -F/ '{ print $NF }'

Cerchiamo solo i file in ~ / tmp e otteniamo un elenco in cui ogni voce è separata da barre. Quindi, usiamo una barra come separatore di campo (-F /) e stampiamo il parametro del campo ($ 1 .. $ 9) che corrisponde all'ultimo campo ($ NF).


Questo è il più veloce che ho provato.
Paulo Almeida,


2

MODIFICA :

Utilizzando sed:

$ find . -type f | sed 's/.*\///'

Usando il comando xargs , come menzionato nella risposta di @nerdwaller

$ find . -type f -print0 | xargs --null -n1 basename

1
Grazie per averlo sottolineato, +1, non ho usato molto xargs ... Sicuramente da quando hai lasciato cadere un bel po 'di caratteri dal mio comando.
nerdwaller,

Questo si interrompe quando i file hanno spazi. Funziona così, almeno in una breve prova:find . -type f -print0| xargs --null -n1 basename
Paulo Almeida,

Nessuna delle opzioni --nullo -n1è disponibile su OSX
Valeriy Van

1

Che dire di questo:

find … | egrep -o -e '[^/]+$'

Vantaggio: viene generato solo un processo aggiuntivo, non uno per ciascun risultato.


0

Puoi chiamare dall'opzione shfind -execed evitare di usare pipe non sicure. Questo ha anche il vantaggio di non doverti preoccupare di nomi di file divertenti (spazi, newline, ecc.):

find . -type f -exec sh -c 'echo "${0##*/}"' {} \;
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.