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
Dans GNU find
, vous pouvez utiliser le paramètre -printf
pour cela, par exemple:
find /dir1 -type f -printf "%f\n"
Si votre recherche n'a pas d'option -printf, vous pouvez également utiliser le nom de base:
find ./dir1 -type f -exec basename {} \;
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.
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
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
Sur mac (BSD find
), utilisez:
find /dir1 -type f -exec basename {} \;