Quelqu'un peut-il suggérer comment renommer le nom de fichier:
head.body.date.txt
À:
head_body_date.txt
Existe-t-il une instruction sur une seule ligne pour effectuer le changement de nom sous Unix ?
Quelqu'un peut-il suggérer comment renommer le nom de fichier:
head.body.date.txt
À:
head_body_date.txt
Existe-t-il une instruction sur une seule ligne pour effectuer le changement de nom sous Unix ?
.tar.gz
s'agit d'une extension? Bienvenue également à U&L!mv head.body.date.txt head_body_date.txt
. Si vous avez d'autres restrictions ou de vrais exemples, veuillez mettre à jour votre question avec ces derniers. Dans l'état actuel des choses, il n'est pas clair si la question se réfère à un fichier avec ce nom explicite, un répertoire unique où tous les fichiers ont un format particulier, ou si vous souhaitez rechercher une hiérarchie de répertoires pour des noms particuliers et les modifier.Réponses:
Itérer sur les noms de fichiers et utiliser l'expansion des paramètres pour la conversion:
Le modèle d'extension des paramètres
${f//./_}
remplace tous les.
s par_
s dans le nom de fichier ($f
).Ce qui précède fera un essai à blanc, pour permettre le changement de nom réel, supprimez
echo
:Si vous souhaitez gérer n'importe quelle extension, pas seulement
.txt
:Après avoir vérifié la suppression
echo
de l'action réelle:Générique, pour un nombre arbitraire de points, au moins un:
la source
for f in *.*; do ...; done
*.*
modèle directement dans l'exemple, car maintenant le code semble ne fonctionner qu'avec un nombre fixe de points.avec
perl
baserename
\.[^.]+$(*SKIP)(*F)
ignorer ce modèle et rechercher des correspondances alternatives|\./_/g
remplacer tout.
par_
Ou, en utilisant l'anticipation négative
Une fois que tout va bien, supprimez l'
-n
optionla source
Utilise le remplacement regex pour rechercher toutes les instances sauf le dernier
.
dans le nom de fichier (lookahead non capturant) et les remplacer par_
. Généraliser*.*
si vous le souhaitez.(cette version particulière de
rename
semble être installée viautil-linux
). J'utiliseUbuntu 12.04
(oui, une machine sérieusement obsolète).la source
bash
:la source
mv --
, pour vous prémunir contre les «anciens» noms de fichiers commençant par-
. (2) Vous devez mettre$old
entre guillemets ("$old"
), pour vous prémunir contre les "anciens" noms de fichiers contenant des espaces ou des caractères spéciaux pour le shell (comme*
et?
). (3) Votre réponse échoue dans le cas quelque peu pathologique où l'extension contient un trait de soulignement:head.body.date.t_xt
devient renomméhead_body_date_t.xt
.En utilisant
mv
,sed
etrev
en une seule ligne:Si vous souhaitez l'appliquer sur tous les
txt
fichiers du représentant actuel, l'utilisation de globes semble délicate en raison de la façon dont celamv
fonctionne, mais vous pouvez faire unefor
boucle dans une ligne:Légèrement plus long, mais vous pouvez faire correspondre plusieurs motifs dans votre boucle!
la source
$(ls …)
; fais justefor file in *.txt
. (2) Vous devez utiliser plus de citations:mv "$file" "$(…)"
.rename
comme plusieurs autres l'ont suggéré dans leurs réponses semble plus simple ...C'est aussi simple que cela pour un seul fichier à la fois. Vous ne spécifiez pas si vous souhaitez que cela se fasse de manière récursive dans un répertoire ou dans l'ensemble du répertoire, ce serait donc la solution la plus pratique et la plus rapide.
la source