545 votes

Comment supprimer le suffixe de fichier et la portion de chemin d'accès d'une chaîne de chemin d'accès dans Bash ?

Étant donné un chemin de fichier de type chaîne, tel que /foo/fizzbuzz.bar comment puis-je utiliser bash pour extraire uniquement le fichier fizzbuzz partie de ladite corde ?

0 votes

Vous trouverez des informations dans Manuel Bash cherchez ${parameter%word} y ${parameter%%word} dans la section d'adaptation de la partie arrière.

783voto

Zan Lynx Points 23100

Voici comment le faire avec les opérateurs # et % dans Bash.

$ x="/foo/fizzbuzz.bar"
$ y=${x%.bar}
$ echo ${y##*/}
fizzbuzz

${x%.bar} pourrait également être ${x%.*} pour supprimer tout ce qui se trouve après un point ou ${x%%.*} pour supprimer tout ce qui se trouve après le premier point.

Exemple :

$ x="/foo/fizzbuzz.bar.quux"
$ y=${x%.*}
$ echo $y
/foo/fizzbuzz.bar
$ y=${x%%.*}
$ echo $y
/foo/fizzbuzz

La documentation se trouve dans le Manuel Bash . Cherchez ${parameter%word} y ${parameter%%word} section d'adaptation de la partie arrière.

1 votes

J'ai fini par utiliser celui-ci parce qu'il était le plus flexible et qu'il y avait quelques autres choses similaires que je voulais faire aussi et qu'il a fait très bien.

0 votes

C'est probablement la plus flexible de toutes les réponses postées, mais je pense que les réponses suggérant les commandes basename et dirname méritent aussi une certaine attention. Elles peuvent faire l'affaire si vous n'avez pas besoin d'une autre correspondance fantaisiste.

8 votes

Comment s'appelle ce ${x%.bar} ? J'aimerais en savoir plus à ce sujet.

352voto

zigdon Points 8753

Regardez la commande basename :

NAME="$(basename /foo/fizzbuzz.bar .bar)"

lui demande d'enlever le suffixe .bar Il en résulte que NAME=fizzbuzz

13 votes

Probablement la plus simple de toutes les solutions proposées actuellement... bien que j'utiliserais $(...) à la place des backticks.

8 votes

Le plus simple mais ajoute une dépendance (pas énorme ou bizarre, je l'admets). Il a également besoin de connaître le suffixe.

0 votes

Et peut être utilisé pour retirer n'importe quoi de la fin, fondamentalement, il fait juste un retrait de chaîne de la fin.

69voto

Param Points 21

Du pur bash, fait en deux opérations séparées :

  1. Supprime le chemin d'une chaîne de chemin :

    path=/foo/bar/bim/baz/file.gif
    
    file=${path##*/}  
    #$file is now 'file.gif'
  2. Supprime l'extension d'une chaîne de chemin :

    base=${file%.*}
    #${base} is now 'file'.

21voto

mike Points 31

En utilisant basename, j'ai utilisé ce qui suit pour y parvenir :

for file in *; do
    ext=${file##*.}
    fname=`basename $file $ext`

    # Do things with $fname
done;

Cela ne nécessite aucune connaissance a priori de l'extension du fichier et fonctionne même si le nom de fichier contient des points (devant l'extension). basename mais cela fait partie des coreutils de GNU, donc il devrait être livré avec n'importe quelle distro.

2 votes

Excellente réponse ! Supprime l'extension de manière très propre, mais pas le . à la fin du nom de fichier.

5 votes

@metrix ajoute simplement le "." avant $ext, c'est-à-dire : fname=`basename $file .$ext`

0 votes

Cela pourrait avoir des conséquences néfastes s'il y a des espaces dans les noms de fichiers. Vous devrez envelopper $file , $ext et la section rétro-collée (y compris les rétro-collés eux-mêmes) entre guillemets.

14voto

Vinko Vrsalovic Points 116138

C'est du pur bash :

~$ x="/foo/bar/fizzbuzz.bar.quux.zoom"; 
~$ y=${x/\/*\//}; 
~$ echo ${y/.*/}; 
fizzbuzz

Cette fonctionnalité est expliquée dans man bash sous "Parameter Expansion". Les méthodes non bash sont nombreuses : awk, perl, sed et ainsi de suite.

EDIT : Fonctionne avec des points dans le fichier suffixes et n'a pas besoin de connaître le suffixe (extension), mais n'a pas travailler avec des points dans le nom lui-même.

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