Réponses:
Une simple doublure devrait faire (en supposant une sh
coque compatible Posix ):
for f in *:*; do mv -v "$f" $(echo "$f" | tr ':' '-'); done
Explication:
for ... in ...; do ...; done
est une boucle
*:*
correspond à tous les fichiers et répertoires du répertoire courant qui ont :
leur nom
f
est affecté à son tour à chacun de ces noms de fichiers dans la boucle
mv
renomme son premier argument en second; -v
(verbeux) lui demande d'imprimer ce qu'il fait; cette option est spécifique à GNU-utils , elle est donc disponible sur Linux mais pas Solaris
$(...)
exécute le code dans un sous-shell et remplace la sortie
echo
imprime son argument sur la sortie standard
tr
lit la sortie standard et traduit les caractères selon la carte fournie
Si vous utilisez bash , vous pouvez éviter de générer un shell supplémentaire ( $()
) avec des sous-processus ( tr
) en le remplaçant $(...)
par ${f//:/-}
.
Comme indiqué dans un autre post de moi, l' rename
outil pourrait faire l'affaire pour vous. Il vous suffit de taper
rename s/:/-/ <files to rename>
Ceci remplace chaque deux-points par un tiret dans tous les fichiers que vous nommez à la fin, c'est-à-dire2013-10-*
Voici le lien vers mon autre article
Je suis sûr qu'un pro UNIX pourrait le faire avec bash, mais voici ma version rapide et sale avec ruby.
path_to_files = "/home/username/wrongnames/"
filenames = `ls #{path_to_files}`.split
filenames.each do |fn|
`mv #{path_to_files + fn} #{path_to_files + fn.gsub(/:/, "-")}`
end
définissez path_to_files sur le chemin d'accès à vos fichiers mal nommés. enregistrez le code ci-dessus dans un fichier appelé rename.rb puis:
username@machinename$ ruby rename.rb
Si vous n'avez qu'un ou quelques fichiers, cela peut faire le changement de nom pour vous:
p="201*"
.old_name=$(ls | grep $p)
.Stockez le nouveau nom de fichier avec les remplacements de caractères nécessaires:
new_name=$(ls | grep $p | sed 's/:/_/g') # Using 'sed'
OR
new_name=$(ls | grep $p | tr ':' '_') # Using 'tr'
Nettoyage de bonus :
a. Si, par souci d'uniformité, vous souhaitez remplacer les tirets (-
) ainsi que les deux-points (:
) pardes traitsde soulignement (_
), vous pouvez le faire:
new_name=$(ls | grep $p | tr ':-' '_');
b. Si vous souhaitez que le dernier trait de soulignement (juste avant le .txt
) disparaisse également, définissez la new_name
variable comme suit:
new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./')
mv $old_name $new_name
NB: mv
échouera si l'un des noms de fichiers de l'opération de renommage spaces
s'y trouve. Dans ce cas, enveloppez les variables appropriées entre guillemets, comme: mv "$old_name" $new_name
OU mv $old_name "$new_name"
OU mv "$old_name" "$new_name"
1a: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | sed 's/:/_/g'); mv $old_name $new_name
1b: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':' '_'); mv $old_name $new_name
2: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_'); mv $old_name $new_name
3: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./'); mv $old_name $new_name
en utilisant renamer :
$ renamer --find ":" --replace "-" *
rename
est un outil préinstallé sur de nombreuses distributions Linux. Mais je pense que pour Windows, cet outil peut être génial.
Cela peut être exagéré, mais vous pouvez renommer tous les caractères spéciaux avec le script sur le lien fourni dans cette réponse:
for f in
boucle ... est une boucle qui itère sur tous les fichiers du répertoire courant où les fichiers doivent correspondre*:*
. (Que se passe-t-il avec les répertoires qui correspondent?). La commande move est un move oldname newname où le nouveau nom est généré en exécutant un shell avec$( subshell here )
. What tr does, ...