Comment renommer plusieurs fichiers ayant des noms différents en fichiers1, fichiers2, fichiers3, etc. [dupliquer]

4

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-il possible de le faire via la ligne de commande?

Je n'ai vu que des questions sur le changement de nom des fichiers qui ont une sorte de modèle, comme rename dog1.txt , dog2.txt - & gt; cat1.txt , cat2.txt .

    
posée Denis Alves 21.07.2017 - 20:32
la source

2 réponses

5

Utilisez l'utilitaire rename pour faire cela:

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

Notes

  • -n fait que la commande vous montre ce qui se passera si vous l'exécutez. Si la sortie est ce que vous voulez, exécutez-la sans -n pour réellement renommer les fichiers.
  • remplacez * 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 lancé par file suivi de %d signifie un nombre et terminé par .txt .
  • le nombre (% d) sera attribué en utilisant ++$::count , qui est un simple compteur itéré après chaque changement de nom.

L'idée vient de ici .

    
réponse donnée Ravexina 21.07.2017 - 20:59
la source
2

Cela peut être fait, mais avec quelques réserves. Vous avez déclaré que "... ces fichiers [sont] dans mon dossier", ce qui constituerait une de ces réserves. Nous pourrions utiliser globstar et itérer sur les noms de fichiers étendus:

$ 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 la méthode "manuelle" via list.txt , où vous pouvez stocker une liste de noms de fichiers et lire ce fichier via 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 sûr, ce thème de liste peut être étendu de plusieurs façons: listes de csv, fichiers json, listes de valeurs-clés, etc. Il y a beaucoup de questions à ce sujet en ligne. Il y a bien sûr d'autres choix à faire, comme donner un chemin complet aux fichiers ou effectuer tout dans le même répertoire que la liste.

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

    
réponse donnée Sergiy Kolodyazhnyy 21.07.2017 - 20:45
la source

Lire d'autres questions sur les étiquettes