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"?
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 ...
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)
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
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."
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.]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.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.