1 votes

mv fichiers avec plusieurs `.` dans le nom de fichier

J'ai quelques fichiers que je reçois avec des noms comme (trop nombreux pour faire cela manuellement tous les jours) :

AA.B.txt
WW.C.txt

et je veux les renommer en AA_B.txt et WW_C.txt afin que le code SQL existant fonctionne toujours comme prévu. Pour l'instant, ces fichiers sont ignorés en raison du format filename.letter.txt.

ls fonctionne et me montre ces fichiers :

$ ls -a *.*.txt
AA.B.txt*
ABR.A.txt*
ABR.B.txt*
ABR.C.txt*
ACT.A.txt*

Cependant, une mv échoue :

$ mv *.*.txt *_*.txt
usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory

Comment faire correspondre le modèle que j'ai avec ce que je veux ?

2voto

Chrisii Points 641

mv n'est pas le bon outil.

Vous devez utiliser le rename commandement :

rename 's/\./_/' *.*.txt

La chaîne 's/\./_/' signifie "remplacer le premièrement l'apparition d'un . avec un _ dans la liste de fichiers suivante".

2voto

Lewis M Points 337

La commande mv ne peut avoir qu'une seule cible, soit en renommant un fichier (par exemple, mv AA.B.txt AA_B.txt), soit en déplaçant un ensemble de fichiers et de répertoires dans un répertoire (par exemple, mv . .txt nouveaudir ). Si vous voulez renommer un fichier, vous devez le faire un par un. Donc, une sorte de boucle.

Essayez quelque chose comme ce qui suit :

for f in *.*.txt; do
    mv ${f} $(echo ${f} | sed -e 's#\.#_#')
done

La commande sed remplace uniquement le premier point trouvé par un trait de soulignement. Les autres points ne sont pas modifiés.

J'espère que cela vous aidera.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X