31 votes

Bash script : enlever l'extension du nom de fichier

J'ai le bash script suivant :

tar -zxvf $1
cd $1

Il devrait extraire le fichier d'archive et entrer dans le répertoire qui a été créé. En général, le fichier d'archive d'un paquet crée un répertoire portant le même nom que le fichier, sans extension, par exemple, mpc-1.0.1.tar.gz crée le répertoire mpc-1.0.1. Comment puis-je modifier la ligne cd $1 pour obtenir le nom du répertoire ? Les fichiers d'archives ont plusieurs extensions : tar.gz, tat.xz, tar.bz2.

137voto

sotapme Points 2527

Vous pouvez utiliser la magie des variables POSIX :

bash-3.2$ FILENAME=somefile.tar.gz
bash-3.2$ echo ${FILENAME%%.*}
somefile
bash-3.2$ echo ${FILENAME%.*}
somefile.tar

Il y a un avertissement : si votre nom de fichier était de la forme ./somefile.tar.gz puis echo ${FILENAME%%.*} supprimerait avidement la correspondance la plus longue avec le fichier . et vous auriez la chaîne vide.

(Vous pouvez contourner ce problème en utilisant une variable temporaire :

FULL_FILENAME=$FILENAME
FILENAME=${FULL_FILENAME##*/}
echo ${FILENAME%%.*}

)


Ce site site explique plus.

${variable%pattern}
  Trim the shortest match from the end
${variable##pattern}
  Trim the longest match from the beginning
${variable%%pattern}
  Trim the longest match from the end
${variable#pattern}
  Trim the shortest match from the beginning

49voto

Vous pouvez utiliser basename .

Exemple :

$ basename foo-bar.tar.gz .tar.gz
foo-bar

Vous devez fournir à basename l'extension qui doit être supprimée, cependant si vous exécutez toujours tar avec -z alors vous savez que l'extension sera .tar.gz .

Cela devrait faire ce que vous voulez :

tar -zxvf $1
cd $(basename $1 .tar.gz)

25voto

Joachim Pileborg Points 121221

Vous pourriez utiliser le cut pour supprimer les deux dernières extensions (les ".tar.gz" partie) :

$ echo "foo.tar.gz" | cut -d'.' --complement -f2-
foo

Comme l'a noté Clayton Hughes dans un commentaire, cela ne fonctionnera pas pour l'exemple réel de la question. Je propose donc comme alternative d'utiliser sed avec des expressions régulières étendues, comme ceci :

$ echo "mpc-1.0.1.tar.gz" | sed -r 's/\.[[:alnum:]]+\.[[:alnum:]]+$//'
mpc-1.0.1

Il fonctionne en supprimant les deux dernières extensions (alpha-numériques) de manière inconditionnelle.

[Mise à jour après le commentaire d'Anders Lindahl]

6voto

Joydip Datta Points 31

J'utilise le script suivant

$ echo "foo.tar.gz"|rev|cut -d"." -f3-|rev
foo

2voto

sqjoatmos Points 41

Avec plus d'un an de retard, mais cela pourrait être utile à quelqu'un qui cherche une réponse simple.

Pour développer le Variables POSIX réponse Notez que vous pouvez réaliser des motifs plus intéressants. Ainsi, pour le cas détaillé ici, vous pourriez simplement faire ceci :

tar -zxvf $1
cd ${1%.tar.*}

Cela coupera la dernière occurrence de .tar. <something>

De manière plus générale, si vous souhaitez supprimer la dernière occurrence de . <something> . <quelque chose d'autre> puis

${1.*.*}

devrait fonctionner correctement.

Le lien de la réponse ci-dessus semble être mort. Voici une excellente explication d'un grand nombre de manipulations de chaînes de caractères que vous pouvez faire directement dans bash, de TLDP.

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