Comment puis-je faire écho uniquement au 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;
tirera le chemin complet avec le nom du fichier. Je veux juste le nom du fichier.
${file##*/}
pour"${file##*/}"
prendre en charge les noms de fichiers avec des espaces, par exemple "Mon nom de fichier avec espaces.txt".Utilisez simplement
basename
:Les guillemets sont nécessaires dans le cas où $ filename contient par exemple des espaces.
la source
$()
comme Oli l'a fait/test 1
,basename $(pwd)
sortie:test
. Testé sur OS X et Ubuntu Server (14.04). La solution native bash, comme le recommande @SiegeX, est ce qui a fonctionné pour moi.basename "$(pwd)"
place.$PWD
au lieu d'exécuter la commande.Utilisez
basename
:la source
echo
?basename
imprime déjà les résultats.echo
peut même altérer le résultat si vous ne citez pas le sous-shell. Exemple:echo $(basename path/with\ \ spaces)
imprime incorrectementwith spaces
(un seul espace).Une autre approche consiste à utiliser
ls
lors de la lecture de la liste de fichiers dans un répertoire afin de vous donner ce que vous voulez, c'est-à-dire "juste le nom du fichier / s". Par opposition à la lecture du chemin complet du fichier, puis à l'extraction du composant "nom de fichier" dans le corps de la boucle for.Exemple ci-dessous qui suit votre original:
Si vous exécutez le script dans le même répertoire que les fichiers, il devient simplement:
la source
ls
inclut tous les fichiers dotfiles où l'*
expansion ne fonctionne généralement pas. Échoue égalementfor f in $(...) ...
si un nom de fichier contient des espaces sauf si vous définissez IFS, peut échouer si un nom de fichier contient un caractère global sauf si vous définissez -f / -o noglob, et en fonction du système ou du shellecho
peut échouer si un nom de fichier est un tiret + lettre ou contient une barre oblique inverse. OTOHls -1 /path/to/dir
imprime de manière fiable chaque nom de fichier sur une ligne, modulo la différence dotfiles.si vous voulez uniquement le nom de fichier:
pour plus d'informations sur la
cut
commande, cliquez ici .la source