6 votes

Renommer les fichiers numériquement (ordre date/heure)

J'ai 200 fichiers dans un dossier. Je les ai téléchargés dans un certain ordre, souvent à quelques secondes d'intervalle. Je voudrais ajouter un numéro au début de chacun des fichiers.

Ainsi, le premier fichier que j'ai téléchargé (le plus ancien) devrait passer de name.txt a 001_name.txt .

Jusqu'au dernier fichier (le plus récemment téléchargé) en passant de name.txt a 200_name.txt .

Comment puis-je le faire en utilisant la ligne de commande ?

17voto

evilsoup Points 4265

Ce qui suit ne fonctionnera pas pour les fichiers contenant des nouvelles lignes, mais devrait fonctionner le reste du temps. Elle triera les fichiers en fonction de l'heure à laquelle ils ont été modifiés pour la dernière fois, plutôt que de leur heure de création réelle, car Ubuntu ne stocke pas l'heure de création des fichiers. Ainsi, si vous avez modifié les fichiers depuis que vous les avez téléchargés, vous n'obtiendrez pas un classement précis.

n=0; ls -tr | while read i; do n=$((n+1)); mv -- "$i" "$(printf '%03d' "$n")"_"$i"; done

ls -tr trie les fichiers par temps de modification, le plus ancien en premier (et quand vous pipez la sortie de ls, il liste automatiquement les fichiers une par ligne plutôt que la façon standard de faire les choses -- il faut noter que c'est un GNU-isme, si vous devez travailler sur un autre *nix avec une version différente de ls mais ce n'est peut-être pas le cas). while read i prend cette liste et passe en revue chaque élément un par un, et le reste du programme se charge du renommage proprement dit.

n=$((n+1)) incrémente la variable $n par un. Il pourrait y avoir des problèmes si cette valeur avait été définie au préalable ; par prudence, il est donc préférable de la fixer à 0 au début de la ligne.

$(printf '%03d' "$n") imprime le nombre contenu dans la variable $n, complété par trois zéros (donc 001, 002 ... 087 ... 999). J'espère que la variable mv est assez évidente.

2voto

Radu Rădeanu Points 156862

Le script suivant fera l'affaire :

#!/bin/bash

if [ $# -ne 1 ];then
  echo "Usage: `basename $0` DIRECTORY"
  exit 1
fi

count=1
ls -tr $@ | while read file; do
    if [ $count -lt 10 ]; then
        mv -v $file '00'$count'_'$file
    elif [ $count -lt 100 ]; then
        mv -v $file '0'$count'_'$file
    else
        mv -v $file '0'$count'_'$file
    fi
    count=$(($count+1))
done

Je l'ai testé et cela a fonctionné pour moi.

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