4 votes

Renommez toutes les extensions de fichiers dans le répertoire

Je suis nouveau dans le scripting, et j'ai un répertoire avec tous les fichiers nommés num.pdb.ostat. Je voudrais renommer tous les num.ostat (c'est-à-dire supprimer le .pdb de tous). Pour un seul fichier cela fonctionne:

mv 2.pdb.ostat 2.ostat

mais quand j'essaie de le faire pour tous les fichiers du dossier avec ce script

for num in ./*; do mv ${num}.pdb.ostat ${num}.ostat; done

rien ne se passe

Est-ce que quelqu'un peut me dire où j'ai fait une erreur?

6voto

Esref Points 275

${num} prend le nom complet du fichier. Vous devez obtenir le nom du fichier sans extension et ajouter votre nouvelle extension. Vous pouvez utiliser un formatage de chaîne. Utilisez la commande suivante :

for num in ./*; do mv ${num} ${num%.*.*}.ostat ; done

% supprime la correspondance la plus courte de $substring à partir de la fin de $string.

5voto

Sparhawk Points 6620

Pour résoudre les problèmes de votre script, essayez de remplacer mv par echo. Vous verrez que votre variable ${num} contient le nom de fichier complet, par exemple 2.pdb.ostat. Par conséquent, votre script essaie essentiellement d'exécuter

mv ./2.pdb.ostat.pdb.ostat ./2.pdb.ostat.ostat

Vous devez plutôt tronquer le nom de fichier pour ne conserver que le numéro. Par exemple,

for filename in ./*; do num="$(echo "${filename}" | grep -o '^./[0-9]*')"; echo "${num}.pdb.ostat" "${num}.ostat"; done

Une fois que vous avez confirmé que la syntaxe est correcte, vous pouvez changer echo en mv et réellement déplacer les fichiers. C'est-à-dire

for filename in ./*; do num="$(echo "${filename}" | grep -o '^./[0-9]*')"; mv "${num}.pdb.ostat" "${num}.ostat"; done

Néanmoins, le moyen le plus simple est d'utiliser (perl) rename.

rename 's/pdb.//' *.pdb.ostat –

Consultez man rename pour plus d'informations.

2voto

Elder Geek Points 34144

Voici un script bash qui réalise ce que vous voulez de manière moins spécifique.

#!/bin/bash

#renext.sh
# un script bash pour changer l'extension des fichiers.
echo "quelle extension souhaitez-vous changer dans ce répertoire?"
read oldext
echo "Vers quoi?"
read newext
for f in *.* 
do
    name=$(echo "$f" | sed 's/\.[^\.]*$//')
    ext=$(echo "$f" | sed 's/^.*\.//')
    target="$name"."$newext"
    echo "le fichier source" "$f" est composé de la base "$name" et se termine avec "$ext"
    if [ -e "$target" ];
    then 
        echo "$target" existe. sauter le renommage.
    else
        mv "$f" "$target"
        echo changé "$f" en "$target"
    fi  
done

Ce script ne se casse pas sur les noms de fichiers avec des espaces et vous permet de choisir les extensions source et cible.

Il fournit des exemples d'une boucle for, de la lecture d'entrée dans des variables, de l'utilisation de sed pour séparer une chaîne au dernier . dans la chaîne (nom de fichier), comment les espaces peuvent être gérés correctement en mettant des guillemets autour des variables, de la vérification de l'existence d'un fichier cible et du contrôle de flux basé sur le résultat d'un test. Il remplit le terminal avec des sorties inutiles qui peuvent être éliminées simplement en supprimant les lignes 14 et 20 qui ne servent vraiment qu'à expliquer.

0voto

Voici un script basé sur la réponse précédente. Trouvez tous les fichiers dans le répertoire dont le nom contient 'Igua', puis renommez tous les fichiers avec la bonne extension

#!/bin/bash
for file in *Igua*
do
  let "i++"
  fileext=${file##*.}
  mv "$file" "Iguazu_$i.$fileext"
done

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X