Comment puis-je obtenir l'extension de fichier à partir de bash? Voici ce que j'ai essayé:
filename=`basename $filepath`
fileext=${filename##*.}
En faisant cela, je peux obtenir une extension du bz2
chemin /dir/subdir/file.bz2
, mais j'ai un problème avec le chemin /dir/subdir/file-1.0.tar.bz2
.
Je préférerais une solution utilisant uniquement bash sans programmes externes si cela est possible.
Pour que ma question soit claire, je créais un script bash pour extraire n’importe quelle archive donnée à l’aide d’une seule commande extract path_to_file
. Comment extraire le fichier est déterminé par le script en voyant sa compression ou le type d' archivage, qui pourrait être tar.gz, .gz, .bz2 etc. Je pense que cela devrait impliquer la manipulation de chaînes, par exemple , si je reçois l'extension .gz
alors je devrait vérifier si elle contient la chaîne .tar
avant .gz
- si oui, l’extension devrait l'être .tar.gz
.
.tar.bz2
Réponses:
Si le nom du fichier est
file-1.0.tar.bz2
, l'extension estbz2
. La méthode que vous utilisez pour extraire l'extension (fileext=${filename##*.}
) est parfaitement valide¹.Comment décidez-vous que vous voulez que l'extension soit
tar.bz2
et nonbz2
ou0.tar.bz2
? Vous devez d'abord répondre à cette question. Ensuite, vous pouvez déterminer quelle commande shell correspond à votre spécification.Une spécification possible est que les extensions doivent commencer par une lettre. Cette heuristique échoue pour quelques extensions communes telles que
7z
, qui pourraient être traitées comme un cas particulier. Voici une implémentation bash / ksh / zsh:Pour la portabilité POSIX, vous devez utiliser une
case
instruction pour la correspondance de modèle.Une autre spécification possible est que certaines extensions dénotent des codages et indiquent qu'une suppression supplémentaire est nécessaire. Voici une implémentation de bash / ksh / zsh (nécessitant
shopt -s extglob
sous bash etsetopt ksh_glob
sous zsh):Notez que ceci est considéré
0
comme une extension dansfile-1.0.gz
.¹ et les constructions associées sont dans POSIX , ils fonctionnent donc dans n’importe quel shell de style Bourne non ancien, tel que cendres, bash, ksh ou zsh.
${VARIABLE##SUFFIX}
la source
.
jeton est de type archive, par exempletar
, si ce n'est pas un type d'archive comme l'0
itération doit se terminer..patch.lzma
. Serait une meilleure heuristique pour tenir compte de la chaîne après la dernière.
: si elle est un suffixe de compression (.7z
,.bz2
,.gz
, ...), continuer de décapage.Vous pouvez simplifier les choses simplement en faisant une correspondance de motif sur le nom du fichier plutôt que d'extraire l'extension deux fois:
la source
Les commentaires à ce sujet ici: http://liquidat.wordpress.com/2007/09/29/short-tip-get-file-extension-in-shell-script/
la source
.tar.gz
extensionVoici mon objectif: convertissez les points en nouvelles lignes
tail
, passez à la dernière ligne:la source
Par exemple:
la source
printf
si le nom du fichier contient une barre oblique inverse ou commence par-
:"${filename#$(printf %s "$filename" | sed 's/\.[^[:digit:]].*$//g;')}"
Un jour, j'ai créé ces fonctions délicates:
J'ai trouvé cette approche simple, très utile dans de nombreux cas, pas seulement pour les extensions.
Pour vérifier les extensions - c'est simple et fiable
Pour l'extension de coupure:
Pour changer d'extension:
Ou, si vous aimez "les fonctions pratiques:
PS Si vous avez aimé ces fonctions ou si vous les avez trouvées utiles, veuillez vous reporter à ce message :) (et mettre un commentaire, espérons-le).
la source
la réponse basée sur le cas jackman est assez bonne et portable, mais si vous voulez juste le nom de fichier et l'extension dans une variable, j'ai trouvé cette solution:
Il ne fonctionne qu'avec des extensions doubles et le premier doit être "tar".
Mais vous pouvez modifier la ligne de test "tar" avec un test de longueur de chaîne et répéter le correctif plusieurs fois.
la source
je l'ai résolu en utilisant ceci:
mais cela ne fonctionne que pour un type d'archivage connu, dans ce cas seulement
tar
la source