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?
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:
Con basename:
find . -type f -exec basename {} \;
;
termina l' -exec
azione. Il \
è necessario perché ;
ha anche significato speciale per la shell.
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
Con GNU find, puoi fare:
find ~/tmp/ -printf "%f\n"
Probabilmente vale la pena provare anche in OS X.
-printf
non è supportato su BSD di OS X find
.
-printf
ha poca relazione con l' printf
utilità 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 -printf
nella ricerca della BSD, sotto quel nome.
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).
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
find . -type f -print0| xargs --null -n1 basename
--null
o -n1
è disponibile su OSX
Che dire di questo:
find … | egrep -o -e '[^/]+$'
Vantaggio: viene generato solo un processo aggiuntivo, non uno per ciascun risultato.