web-dev-qa-db-fra.com

Remplacer tous les deux points à partir des noms de fichiers par un terminal

J'ai sur mon disque dur un volume de musique de 1 Go formaté avec EXT4. Je souhaite déplacer ces fichiers sur une partition de disque dur formatée FAT. Cependant, je ne peux pas déplacer la plupart de mes fichiers car ils contiennent ":" dans leurs noms (par exemple, "Act 2: ....." pour les opéras). Existe-t-il un moyen avec la ligne de commande de renommer tous mes fichiers de "XXXX: XXXX" à "XXXX-XXXX"?

10
Ryan McClure

Si tous vos fichiers sont dans un seul répertoire, essayez:

rename 's|:|-|g' *

(où * peut être changé pour quelque chose de plus restrictif si vous le souhaitez)

Si vous avez plusieurs fichiers dans une arborescence de répertoires, essayez ceci à partir de la base de l'arborescence:

find . -name "*:*" -exec rename 's|:|-|g' {} \;

Vous pouvez ajouter l’option -n juste après rename pour qu’elle vous dise ce qu’elle ferait sans le faire RÉELLEMENT. Cela pourrait vous aider à éviter de marcher accidentellement sur d’autres fichiers ou quelque chose de mauvais ...

22
AeroGT80

Je ne suis pas sur ma machine Linux en ce moment, donc je ne peux que donner des informations approximatives.

Linux a un utilitaire en ligne de commande appelé rename qui fonctionne avec d’autres entrées, expressions régulières ou expressions rationnelles. Vous devriez pouvoir utiliser cela avec une expression rationnelle du type "s /:/- /" sur vos fichiers pour obtenir le changement de nom que vous souhaitez.

Juste pour être sûr, faites-le par petits lots et/ou testez d'abord avec la simulation (renommer a un drapeau qui vous donne simplement l'ancien nom et le nouveau nom du fichier sans renommer réellement - utilisez ceci pour vérifier d'abord)

0
Karthik T

Je réalise que c'est un très vieux post. La solution récursive d'AeroGT80 est très complète, mais elle est plutôt lente. Je l'ai fait tourner pendant environ une demi-heure sur un serveur plus lent, mais à peu près la moitié seulement. Je pense qu'il s'agissait d'environ 73 000 fichiers répartis dans environ 300 sous-répertoires.

La solution ci-dessous fonctionnera beaucoup plus rapidement (elle concerne tous les fichiers d'un répertoire au lieu de chaque fichier un par un, à l'aide de la solution non récursive d'AeroGT80). Le seul problème est qu'il ne descend que dans un répertoire (il n'est donc pas complètement récursif, contrairement à sa solution), mais je suis sûr qu'il pourrait être modifié assez facilement.

#!/bin/bash
for D in *; do
        if [ -d "${D}" ]; then
                #echo "${D}"
                pushd "${D}" > /dev/null
                rename 's|:|-|g' *
                popd > /dev/null
        fi
done
0
Adam Plocher

C'est une solution dans python qui gère le cas où les fichiers ne sont pas nécessairement dans le même répertoire.

import os
torename = []
rootdir = "The main directory"
logfile = "Path to log file" #Eg: logfile = "/home/prasanth/renamelog"
for (path, dirs, files) in os.walk(rootdir):
    for dirname in dirs:
        if ':' in dirname:
            torename.append(os.path.join(path, dirname))
    for filename in files:
        if ':' in filename:
            torename.append(os.path.join(path, filename))

print "No of files/dirs to rename =", len(torename)
a = raw_input("Continue? (y/n) ")
if a == 'y':
    torename.reverse()
    for oldname in torename:
        directory, filename = os.path.split(oldname)
        newname = os.path.join(directory, filename.replace(':', '-'))
        command = 'mv %s %s > /dev/null' % (repr(oldname), repr(newname))
        os.system(command)
        f = open(logfile, 'a')
        f.write(oldname + '\n')
        f.close()
else:
    print "Aborted."
  1. Enregistrez ceci dans un fichier (par exemple) rename.py.
  2. Remplacez rootdir par le répertoire le plus externe considéré (utilisez le nom de chemin complet en commençant par /. Aucun raccourci ni variable d’env comme ~ autorisés). Inutile de mettre\avant les caractères spéciaux - par exemple, si le répertoire le plus externe est /.../Mon HDD, mettez rootdir = "/.../My HDD" NOT rootdir = "/.../My\ HDD" (notez le "s) [Je ne suis que cela explicitement parce que vous ne connaissez peut-être pas Python. Aucun manque de respect.]
  3. Remplacez logfile par l’emplacement souhaité du fichier journal. En fin de compte, ce fichier contiendra la liste des fichiers renommés - pour référence future.
  4. Appelez python rename.py.

Avertissement: testez un petit échantillon avant de risquer un Go de musique entier.

Détails: Le changement de nom est effectué à partir des fichiers les plus internes.

0
S Prasanth