web-dev-qa-db-fra.com

Comment ajouter des noms en ordre croissant aux noms de fichiers tels que 1_ 2_?

Comment puis-je ajouter des numéros aux fichiers d'un répertoire?

Dans un répertoire, j'ai des fichiers comme ci-dessous:

fileA
fileB
fileC
fileD

Je veux leur ajouter des numéros ascendants, comme ceci:

1_fileA
2_fileB
3_fileC
4_fileD

Merci d'avance.

6
paweljvn

Une des solutions:

cd <your dir> puis exécuté dans bash (copier et coller en ligne de commande):

n=1; for f in *; do mv "$f" "$((n++))_$f"; done

Cas de script Bash:

#!/bin/bash
n=1
for f in *
do
  if [ "$f" = "rename.sh" ]
  then
    continue
  fi
  mv "$f" "$((n++))_$f"
done

enregistrez-le sous le nom rename.sh dans le répertoire avec les fichiers à renommer, chmod +x rename.sh, puis exécutez-le ./rename.sh

8
mature

S'il y a plus de 9 fichiers, j'utiliserais printfpour entrer le numéro et obtenir l'ordre de tri attendu, comme ceci

n=0
for f in *
    do printf -v new "%2d$((++n))_$f"
    echo mv -v -- "$f" "$new"
done

Supprimez echolorsque vous voyez le résultat correct.

Explication

Dans cette ligne, do printf -v new "%2d$((++n))_$f", nous créons un format pour les nouveaux noms de fichiers et nous le plaçons dans la variable newname__.

%2d est un nombre décimal à 2 chiffres. Au lieu de 2d, vous pouvez utiliser 3d etc pour obtenir un autre 0 initial (si vous avez plus de 99 fichiers).

((++n)) incrémente la variable n(définie à 0 au début du script). Comme il est itéré une fois à chaque exécution de la boucle, les fichiers reçoivent des préfixes de nom incrémentés.

-v fait mvimprimer ce qui sera changé.

-- dans l'instruction mvsert à empêcher que les noms de fichiers commençant par - ne soient interprétés comme des options.

7
Zanna

C’est un travail pour file-rename Install file-rename (renommé Perl):

file-rename -n 'our $i; if (!$i) {$i++}; s/^/sprintf("%d_", $i++)/e' *

Ceci définit une variable, l’augmente si elle n’est pas définie (sinon, elle commence par 0 au lieu de 1) et remplace le début du nom de fichier par le nombre qui l’augmente à chaque fois. Vous pouvez changer le format facilement, par exemple pour le faire en trois chiffres (001, 002,…), utilisez "%03d_". Son exécution avec -n imprime uniquement les modifications. Pour renommer, supprimez cet indicateur.

Exemple d'exécution

À l'aide du système alternatif, rename est lié à file-rename sur mon système.

$ ls -1
fileA
fileB
fileC
fileD
$ rename -n 'our $i; if (!$i) {$i++}; s/^/sprintf("%d_", $i++)/e' *
rename(fileA, 1_fileA)
rename(fileB, 2_fileB)
rename(fileC, 3_fileC)
rename(fileD, 4_fileD)
$ rename 'our $i; if (!$i) {$i++}; s/^/sprintf("%d_", $i++)/e' *
$ ls -1
1_fileA
2_fileB
3_fileC
4_fileD
6
dessert
  1. Ouvrez votre répertoire dans Nautilus.

  2. Mettez en surbrillance tous les fichiers.

  3. Cliquez avec le bouton droit de la souris et sélectionnez "Renommer ..." dans le menu contextuel.

  4. Dans la boîte de dialogue Renommer, cliquez sur le bouton +Add bouton.

  5. Sélectionnez "1,2,3,4" sous "Numéros automatiques"

  6. Ensuite, dans la boîte de dialogue Renommer, dans le champ de saisie de texte, insérez un caractère de soulignement "_" entre "[1, 2, 3]" et "[Nom du fichier d'origine]".

    Cela devrait ressembler à "[1, 2, 3] _ [nom du fichier original]"

  7. Clique le Rename bouton.

Select "1,2,3,4" in the Rename dialog

The renamed files

6
PJ Singh

Une option est

cd /path/to/folder/
ls -1v | rename -n -v 's/^/sprintf("%02d_", ++our$i)/e'
  • Cela fonctionne bien, sauf avec les noms de fichier avec la nouvelle ligne "\ n". Switch '-1vtake s'occupe des espaces et des tabulations,

  • Les autres commandes publiées ici modifient l'ordre des fichiers avec des nombres, par exemple. 10a vient avant 1a.

  • Celui qui convient dans une situation.

J'ai eu le temps de tester toutes ces commandes. Voici les résultats.

$ ls
001abc.txt  '10a bc.txt'   1abc.txt  '2ab c.txt'  'a'$'\t''bc.txt'

$ ls -1v | rename -n -v 's/^/sprintf("%02d_", ++our$i)/e'
Reading filenames from file handle (GLOB(0x55cb57991b28))
rename(001abc.txt, 01_001abc.txt)
rename(1abc.txt, 02_1abc.txt)
rename(2ab c.txt, 03_2ab c.txt)
rename(10a bc.txt, 04_10a bc.txt)
rename(a    bc.txt, 05_a    bc.txt)

$ n=1; for f in *; do echo mv "$f" "$((n++))_$f"; done
mv 001abc.txt 1_001abc.txt
mv 10a bc.txt 2_10a bc.txt
mv 1abc.txt 3_1abc.txt
mv 2ab c.txt 4_2ab c.txt
mv a    bc.txt 5_a  bc.txt

$ for f in *;     do printf -v new "%2d$((++n))_$f";     echo mv -v -- "$f" "$new"; done
mv -v -- 001abc.txt  09_001abc.txt
mv -v -- 10a bc.txt  010_10a bc.txt
mv -v -- 1abc.txt  011_1abc.txt
mv -v -- 2ab c.txt  012_2ab c.txt
mv -v -- a  bc.txt  013_a   bc.txt

$ ./rename.sh 
mv 001abc.txt 1_001abc.txt
mv 10a bc.txt 2_10a bc.txt
mv 1abc.txt 3_1abc.txt
mv 2ab c.txt 4_2ab c.txt
mv a    bc.txt 5_a  bc.txt

$ rename -n 'our $i; if (!$i) {$i++}; s/^/sprintf("%d_", $i++)/e' *
rename(001abc.txt, 1_001abc.txt)
rename(10a bc.txt, 2_10a bc.txt)
rename(1abc.txt, 3_1abc.txt)
rename(2ab c.txt, 4_2ab c.txt)
rename(a    bc.txt, 5_a bc.txt)
rename(rename.sh, 6_rename.sh)

$ for f in *;     do printf -v new "%2d$((++n))_$f";     echo mv -v -- "$f" "$new"; done
mv -v -- 001abc.txt  01_001abc.txt
mv -v -- 10a bc.txt  02_10a bc.txt
mv -v -- 1abc.txt  03_1abc.txt
mv -v -- 2ab c.txt  04_2ab c.txt
mv -v -- a  bc.txt  05_a    bc.txt
mv -v -- rename.sh  06_rename.sh
1
Vijay