Renommer des fichiers Linux ayant accidentellement plusieurs extensions .mp3

7

J'ai foiré et ai accidentellement un tas de fichiers avec l'extension .mp3.mp3.mp3.mp3

Comment puis-je les modifier, de manière récursive - et sur plusieurs annuaires - pour les définir simplement .mp3?

utilisateur365967
la source

Réponses:

16

Il existe une solution assez simple, qui consiste à tout couper du premier ".mp3", puis à ajouter ".mp3". Alors:

for file in $(find . -name "*.mp3"); do mv "$file" "${file%%.mp3*}.mp3"; done
seumasmac
la source
4

Utilisation de l' renameutilitaire fourni avec perl ( perl-renamesur certains systèmes) et d'un shell avec **(zsh ou bash avec shopt -s globstar, entre autres):

rename 's/(\.mp3)+$/.mp3/' /somedir/**/*.mp3
Hobbs
la source
2

En utilisant la findcommande dans bashet quelques scripts créatifs, ceci peut être nettoyé comme par magie. Les scripts suivants ont été testés sous Mac OS X 10.9.5 mais devraient également fonctionner correctement sous Linux. Commencez par exécuter ceci comme un «essai à sec» pour vous assurer de cibler les bons fichiers:

find '/path/to/your/files' -type f -name '*.mp3.mp3*' |\
  while read RAW_FILE
  do
    DIRNAME=$(dirname "$RAW_FILE")
    BASENAME=$(basename "$RAW_FILE")
    FILENAME="${BASENAME%%.*}"
    EXTENSION="${BASENAME#*.}"
    echo "mv "${RAW_FILE}" "${DIRNAME}/${FILENAME}".mp3"
  done

Vous devez d’abord changer le /path/to/your/filespour faire correspondre le chemin réel aux fichiers affectés sur le système. A noter également la dernière ligne qui est echod'une mvcommande (de déplacement). Je le fais pour m'assurer que le script cible les bons fichiers.

La findlogique de base est la suivante:

find '/path/to/your/files' -type f -name '*.mp3.mp3*'

Ce qui signifie fondamentalement «Trouvez tous les fichiers du chemin /path/to/your/filesqui sont en fait des fichiers (et non des répertoires) ayant un motif de nom de fichier correspondant *.mp3.mp3*. Cela devrait intercepter tous les fichiers auxquels plus d'un fichier est .mp3attaché. .mp3.mp3, .mp3.mp3.mp3, .mp3.mp3.mp3.mp3, .mp3.mp3.mp3.mp3.mp3, Etc ...

Le script ne se gênera pas pour traiter les fichiers qui ont juste le bon résultat, .mp3ce qui constitue un avantage certain en termes de rapidité si vous ne possédez qu'un petit sous-ensemble de fichiers mal nommés .mp3.mp3.mp3.mp3au lieu de devoir renommer tous les fichiers .mp3.

Ainsi, lorsque vous exécutez cette opération, vous devriez voir une liste de mvcommandes «d'essai à sec» qui résoudront votre problème: Recherchez tous ces .mp3fichiers multiples et renommez-les en un fichier singulier .mp3.

Maintenant que cela fonctionne bien, lancez le script final comme ceci:

find '/path/to/your/files' -type f -name '*.mp3.mp3*' |\
  while read RAW_FILE
  do
    DIRNAME=$(dirname "$RAW_FILE")
    BASENAME=$(basename "$RAW_FILE")
    FILENAME="${BASENAME%%.*}"
    EXTENSION="${BASENAME#*.}"
    mv "${RAW_FILE}" "${DIRNAME}/${FILENAME}".mp3
  done

Notez que la dernière ligne est la mvcommande fonctionnelle actuelle . Lorsque vous exécutez cette version du script, votre répertoire entier sera recherché pour ces plusieurs .mp3fichiers, puis exécutera la mvcommande complète pour résoudre le problème.

JakeGould
la source
1
+1, ta réponse est meilleure que la mienne. ;-)
Sirex