web-dev-qa-db-fra.com

Comment renommer plusieurs fichiers portant des noms différents en fichier1, fichier2, fichier3, etc.?

Disons que j'ai ces fichiers dans mon dossier:

cat.txt
dog.txt
house.txt
tree.txt

Je veux tous les renommer en quelque chose comme ceci:

file1.txt
file2.txt
file3.txt
file4.txt

Est-ce possible de le faire via la ligne de commande?

J'ai seulement vu des questions sur le changement de nom de fichiers comportant une sorte de motif, comme renommer dog1.txt, dog2.txt -> cat1.txt, cat2.txt.

4
Denis Alves

Utilisez l'utilitaire rename pour le faire:

rename -n '$_ = sprintf "file%d.txt", ++$::count' *

Remarques

  • -n fait en sorte que la commande vous montre ce qui se passera si vous l'exécutez. Si le résultat correspond à vos souhaits, exécutez-le sans -n pour renommer les fichiers.
  • remplacez le * par ce que vous voulez renommer, par exemple: dog*.txt pour renommer uniquement dog1.txt, dog2.txt ... en file1.txt, file2.txt, etc.
  • $_ est une entrée par défaut (noms de fichiers) que nous devrions modifier.
  • en utilisant = nous le modifions
  • avec sprintf nous définissons un schéma démarré par file suivi de %d signifie un nombre et se termine par le .txt.
  • le numéro (% d) sera attribué à l'aide de ++$::count, qui est un simple compteur itéré après chaque changement de nom.

L'idée vient de ici .

5
Ravexina

C'est peut-être fait, mais avec quelques réserves. Vous avez déclaré que "... ces fichiers [sont] dans mon dossier", ce qui serait l'une de ces mises en garde. Nous pourrions utiliser globstar et itérer sur les noms de fichiers développés:

$ c=0;for f in *; do ((c++));  echo "$f" "--->" file"$c".txt ; done                            
cat.txt ---> file1.txt
dog.txt ---> file2.txt
house.txt ---> file3.txt
tree.txt ---> file4.txt

Bien sûr, vous pouvez toujours utiliser le mode "manuel" via un list.txt, où vous pouvez stocker une liste de noms de fichiers et lire ce fichier via le while IFS= read -r ; do ... done < list.txt.

$ c=0; while IFS= read -r f; do ((c++)); echo "$f" file"$c" ; done < input.txt                 
cat.txt file1
dog.txt file2
tree.txt file3

Bien entendu, ce thème de liste peut être étendu de nombreuses manières - listes csv, fichiers json, listes de valeurs-clés - vous le nommez. Il y a beaucoup de questions sur ces en ligne. Il y a bien sûr d'autres choix à faire, comme donner un chemin complet aux fichiers ou tout faire dans le même répertoire que la liste.

Enfin, j'ai déjà fait allusion aux listes de valeurs-clés. Avec bash et d'autres langages de script plus modernes tels que Python ou Perl, vous pouvez avoir un hachage (ou un dictionnaire) avec une liste de fichiers et le nouveau nom correspondant que vous souhaitez attribuer au fichier.

2
Sergiy Kolodyazhnyy