J'ai un groupe de fichiers qui ont :
(deux points) dans le nom. Je dois remplacer le :
par -
(tiret).
Existe-t-il un moyen simple de le faire dans un script?
Exemple de nom de fichier: 2013-10-11:11:52:08_055456663_045585_.txt
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//:/-}
.
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, ...$(echo "$f" | tr ':' '-')
par"${f//:/-}"
et éviter l'appel de sous-shell, de canal et de programme externe. Je pense que c'est un bashisme, mais hein. Voyez ici .Comme indiqué dans un autre post de moi, l'
rename
outil pourrait faire l'affaire pour vous. Il vous suffit de taperrename 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
la source
Je suis sûr qu'un pro UNIX pourrait le faire avec bash, mais voici ma version rapide et sale avec ruby.
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:
la source
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:
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:b. Si vous souhaitez que le dernier trait de soulignement (juste avant le
.txt
) disparaisse également, définissez lanew_name
variable comme suit:mv $old_name $new_name
NB:
mv
échouera si l'un des noms de fichiers de l'opération de renommagespaces
s'y trouve. Dans ce cas, enveloppez les variables appropriées entre guillemets, comme:mv "$old_name" $new_name
OUmv $old_name "$new_name"
OUmv "$old_name" "$new_name"
One-liners
la source
en utilisant renamer :
la source
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:
/superuser//a/858671/365691
la source