web-dev-qa-db-fra.com

Comment obtenir un nom de fichier avec linux `find`?

J'utilise find pour tous les fichiers du répertoire, alors je reçois une liste de chemins. Cependant, je n'ai besoin que de noms de fichiers. c'est-à-dire que j'obtiens ./dir1/dir2/file.txt et que je veux obtenir file.txt

237
marverix

Dans GNU find, vous pouvez utiliser le paramètre -printf pour cela, par exemple:

find /dir1 -type f -printf "%f\n"
312
SiegeX

Si votre recherche n'a pas d'option -printf, vous pouvez également utiliser le nom de base:

find ./dir1 -type f -exec basename {} \;
144
Kambus

Utilisez -execdir qui contient automatiquement le fichier actuel dans {}, par exemple:

find . -type f -execdir echo '{}' ';'

Vous pouvez également utiliser $PWD au lieu de . (sur certains systèmes, il ne produira pas de point supplémentaire à l'avant).

Si vous avez toujours un point supplémentaire, vous pouvez également exécuter:

find . -type f -execdir basename '{}' ';'

-execdir utility [argument ...] ;

Le -execdir primaire est identique au -exec primaire avec l'exception que cet utilitaire sera exécuté à partir du répertoire contient le fichier actuel.

Lorsqu'il est utilisé + au lieu de ;, alors {} est remplacé par autant de noms de chemin que possible pour chaque appel d'utilitaire. En d'autres termes, tous les noms de fichiers seront imprimés sur une ligne.

23
kenorb

Si vous utilisez GNU find

find . -type f -printf "%f\n"

Ou vous pouvez utiliser un langage de programmation tel que Ruby (1.9+)

$ Ruby -e 'Dir["**/*"].each{|x| puts File.basename(x)}'

Si vous avez envie d'une solution bash (au moins 4)

shopt -s globstar
for file in **; do echo ${file##*/}; done
21
kurumi

Si vous souhaitez exécuter une action uniquement sur le nom de fichier, utiliser basename peut s'avérer difficile.

Par exemple ceci:

find ~/clang+llvm-3.3/bin/ -type f -exec echo basename {} \; 

va juste faire écho le nom de base /my/found/path. Pas ce que nous voulons si nous voulons exécuter le nom de fichier.

Mais vous pouvez alors xargs la sortie. Par exemple, pour tuer les fichiers d'un répertoire basé sur les noms d'un autre répertoire:

cd dirIwantToRMin;
find ~/clang+llvm-3.3/bin/ -type f -exec basename {} \; | xargs rm
11
j03m

Sur mac (BSD find), utilisez:

find /dir1 -type f -exec basename {} \;
6
spectrum