web-dev-qa-db-fra.com

Comment changer les noms des fichiers d'un répertoire en noms générés aléatoirement?

J'ai de nombreux fichiers avec des noms différents de longueurs différentes. L'extension de ces fichiers est jpeg.

Comment changer les noms des fichiers en noms générés aléatoirement?

2
Denis

Exécutez dans le répertoire avec les fichiers:

for file in *.jpeg; do
    mv -- "$file" "$RANDOM.jpeg"
done

Mais il y a une chance que les noms aléatoires entrent en conflit puisque $RANDOM donne uniquement des nombres compris entre 0 et 32767.

Meilleure solution, grâce à pbhj :

for file in *.jpeg; do
    mv -- "$file" "$(mktemp --dry-run XXXXXXXX.jpeg)"
done

Il y a toujours une chance que les noms aléatoires entrent en conflit, mais il est nettement plus petit avec 8 caractères alphanumériques de mktemp. Voir réponse d'Anselmo pour garantir l'absence de conflits.

3
wjandrea

L'utilisation de RANDOM est une approche limitée. De BASH man: "RANDOM Chaque fois que ce paramètre est référencé, un entier aléatoire entre 0 et 32767 est généré." Alors ... Pas plus de 32768 fichiers! :)

Un autre problème, plus important, est la possibilité de répétition. Vous voyez, le problème de la répétition affecte toute utilisation de générateurs aléatoires, uniquement avec une probabilité d'occurrence différente.

L'utilisation de mktemp peut être une bien meilleure solution, mais vous ne devez pas utiliser le paramètre --dry-run, car cela génère le nom mais ne garantit pas qu'un fichier portant ce nom n'existe pas. Utilisé de cette façon, il n'est devenu qu'une sorte de générateur aléatoire.

Donc, ma proposition simple est:

for file in *.jpeg; do
    new_file="$(mktemp XXXXXXXX.jpeg)"
    mv -f -- "$file" "$new_file"
done

Pas à pas.

new_file="$(mktemp XXXXXXXX.jpeg)"

En exécutant mktemp de cette façon, il crée un fichier en toute sécurité avec un nouveau nom aléatoire, en prenant soin de la répétition aléatoire. Il affiche également le nom du fichier créé, que j'attrape dans new_file.

mv -f -- "$file" "$new_file"

L'exécution du mv avec -f force le changement de nom de l'image pour écraser le nouveau_fichier.

Vous pouvez le faire facilement avec une grande certitude que vous n'obtiendrez pas de noms de fichiers avec des noms similaires en ayant plusieurs $RANDOM Comme suit:

for file in *.jpeg; do
    mv -- "$file" "$RANDOM-$RANDOM-$RANDOM.jpeg"
done

La possibilité d'obtenir le même nom est 1/(32767)^3 dans l'exemple ci-dessus.

0
Amir