120 votes

Pour les fichiers dans le répertoire, seulement l'écho du nom de fichier (pas de chemin).

Comment faire pour n'afficher que le nom de fichier d'un fichier si j'itère un répertoire avec une boucle for ?

for filename in /home/user/*
do
  echo $filename
done;

affichera le chemin complet avec le nom du fichier. Je veux juste le nom du fichier.

208voto

SiegeX Points 32614

Si vous voulez un natif bash solution

for file in /home/user/*; do
  echo "${file##*/}"
done

Les utilisations ci-dessus Expansion des paramètres qui est natif du shell et ne nécessite pas d'appel à un binaire externe tel que basename

Cependant, je vous suggère d'utiliser simplement find

find /home/user -type f -printf "%f\n"

12 votes

Bonne réponse. Pour ceux qui souhaitent en savoir plus sur l'expansion des paramètres : wiki.bash-hackers.org/syntaxe/pe#substring_removal

1 votes

-printf : primaire ou opérateur inconnu => unix.stackexchange.com/a/272493/72893

3 votes

Envisagez de changer ${file##*/} a "${file##*/}" pour supporter les noms de fichiers avec des espaces, par exemple "Mon nom de fichier avec des espaces.txt".

56voto

Sean Bright Points 39480

Il suffit d'utiliser basename :

echo `basename "$filename"`

Les guillemets sont nécessaires dans le cas où $filename contient par exemple des espaces.

3 votes

Mieux vaut utiliser l'expansion des paramètres, ne nécessite pas d'appel à des binaires externes.

8 votes

En fait, `` est déprécié. Il est préférable d'utiliser $() comme Oli l'a fait

1 votes

Désolé de commenter cette vieille réponse, mais basename ne fonctionne pas correctement pour les fichiers contenant des espaces. Exemple : sortie de pwd : /test 1 , basename $(pwd) sortie : test . Testé sur OS X et Ubuntu Server (14.04). La solution bash native, comme @SiegeX l'a recommandé, est ce qui a fonctionné pour moi.

19voto

Oli Charlesworth Points 148744

Utilice basename :

echo $(basename /foo/bar/stuff)

1 votes

Pourquoi utilisez-vous echo ? basename imprime déjà les résultats. echo peut même fausser le résultat si vous ne citez pas la sous-couche. Exemple : echo $(basename path/with\ \ spaces) imprime incorrectement with spaces (un seul espace).

12voto

Ryan Walker Points 323

Une autre approche consiste à utiliser ls lors de la lecture de la liste des fichiers dans un répertoire afin de vous donner ce que vous voulez, c'est-à-dire "juste le(s) nom(s) de fichier". Par opposition à la lecture du chemin d'accès complet au fichier et à l'extraction du composant "nom du fichier" dans le corps de la boucle for.

Exemple ci-dessous qui suit votre original :

for filename in $(ls /home/user/)
do
  echo $filename
done;

Si vous exécutez le script dans le même répertoire que les fichiers, alors cela devient simplement :

for filename in $(ls)
do
  echo $filename
done;

1 votes

ls inclut tous les dotfiles où * l'expansion ne le fait généralement pas. Voir aussi for f in $(...) ... échoue si un nom de fichier contient des espaces à moins que vous ne définissiez IFS, peut échouer si un nom de fichier contient un caractère global à moins que vous définissiez -f/-o noglob, et selon le système ou le shell echo peut échouer si un nom de fichier est un trait d'union + une lettre ou contient une barre oblique inverse. En revanche, il suffit de ls -1 /path/to/dir à lui seul imprime de manière fiable chaque nom de fichier sur une ligne, modulo la différence dotfiles.

0voto

josef Points 306

Si vous voulez seulement le nom du fichier :

for file in /home/user/*; do       
  f=$(echo "${file##*/}");
  filename=$(echo $f| cut  -d'.' -f 1); #file has extension, it return only filename
  echo $filename
done

pour plus d'informations sur cut voir la commande aquí .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X