Je cherche à obtenir une liste de noms de fichiers uniquement (sans le reste du chemin) lors de l'exécution de la commande find à partir d'un terminal. Comment puis-je accomplir cela sur le mac?
Je cherche à obtenir une liste de noms de fichiers uniquement (sans le reste du chemin) lors de l'exécution de la commande find à partir d'un terminal. Comment puis-je accomplir cela sur le mac?
Réponses:
Avec le nom de base:
find . -type f -exec basename {} \;
;
met fin à l' -exec
action. Le \
est nécessaire car a ;
également une signification particulière pour le shell.
Evilsoup a mentionné que ce qui a été publié ne fonctionne pas pour les noms de fichiers espacés. Vous pouvez donc utiliser à la place:
find . -type f -print0 | while IFS= read -r -d '' filename; do echo ${filename##*/}; done
Avec GNU find, vous pouvez faire:
find ~/tmp/ -printf "%f\n"
Cela vaut probablement aussi la peine d'essayer sous OS X.
-printf
est pas pris en charge sur BSD OS X find
.
-printf
n'a que peu de rapport avec le C printf
ou l'utilitaire shell POSIX printf
. L'utilisation de ce nom de fonction historique pour quelque chose de différent est très mal envisagée. Les gars BSD conservateurs le voient probablement de la même manière, donc nous ne verrons probablement pas de clone -printf
dans la découverte BSD, sous ce nom.
Il existe un meilleur moyen de supprimer tout sauf la dernière partie d'un chemin de fichier; avec awk. C'est mieux car awk n'est pas exécuté une fois pour chaque fichier. Dans certains cas, cela compte.
find ~/tmp/ -type f | awk -F/ '{ print $NF }'
Nous recherchons uniquement les fichiers dans ~ / tmp et nous obtenons une liste où chaque entrée est séparée par des barres obliques. Par conséquent, nous utilisons une barre oblique comme séparateur de champ (-F /) et imprimons le paramètre de champ ($ 1 .. $ 9) qui correspond au dernier champ ($ NF).
MODIFIER :
En utilisant sed
:
$ find . -type f | sed 's/.*\///'
Utilisation de la commande xargs , comme mentionné dans la réponse de @nerdwaller
$ find . -type f -print0 | xargs --null -n1 basename
find . -type f -print0| xargs --null -n1 basename
--null
ou -n1
n'est disponible sur OSX
Et ça:
find … | egrep -o -e '[^/]+$'
Avantage: un seul processus supplémentaire est généré, pas un pour chaque résultat.