2 votes

Script pour déplacer les fichiers sous leur nom de première lettre

J'ai beaucoup de fichiers (1000+) dans un seul répertoire, et je voudrais les organiser en sous-répertoires, en fonction de leur première lettre. Donc j'ai 200 fichiers commençant par A, et je voudrais les déplacer dans le sous-répertoire "A", puis tous les fichiers commençant par "B" etc. etc.

Comment faire ?

6voto

Harald Hanche-Olsen Points 3981

Dans un terminal: cd dans le répertoire en question, puis

for x in `ls -1 | sed -e 's/^\(.\).*/\1/' | sort -u`; do
mkdir $x && mv -i ${x}?* $x
done

Cela suppose qu'aucun fichier n'a un nom à un seul caractère avant que vous ne commenciez. Si c'est le cas, vous voudrez peut-être les déplacer avant d'exécuter la procédure ci-dessus:

mkdir singles && mv ? singles

et ensuite les déplacer vers leurs destinations appropriées par la suite.

Éditer: Voir les commentaires ci-dessous pour quelques avertissements. Si vous rencontrez des problèmes avec des lignes de commandes trop longues, vous pouvez remplacer la deuxième ligne par

mkdir $x && find . -maxdepth 1 -name "${x}?*" -exec mv -i {} $x \;

0 votes

Cela échoue avec les fichiers qui ont des espaces (ou des sauts de ligne) dans leur nom. La substitution de commandes peut également entraîner un trop grand nombre d'arguments.

0 votes

@slhck : Non, les espaces dans les noms de fichiers ne posent aucun problème, sauf si le nom de fichier commence par un espace. Oui, les sauts de ligne pourraient poser problème, mais ces deux cas sont distinctement inhabituels. La substitution de commandes pourrait poser problème si trop de noms de fichiers commencent par la même lettre. Mais je pense que la limite actuelle de la longueur de la ligne de commande est assez généreuse, donc cela n'est pas très probable avec le nombre de fichiers indiqués. Cependant, je vais ajouter une correction à la réponse.

0 votes

Ah, maintenant je vois, c'était ma faute, +1 pour toi!

3voto

OJ. Points 16939

Voici une ligne de commande Ruby :

ruby -e 'require "FileUtils"; Dir["*"].each { |f| next if File.directory?(f); d = f[0]; Dir.mkdir d rescue nil; FileUtils.mv(f,d) }'

Elle itère essentiellement sur tous les fichiers, crée les répertoires si possible et déplace les fichiers dedans par la suite.

Il suffit d'exécuter cette ligne depuis le répertoire.

0voto

Cela fonctionnerait également si les noms de fichiers commencent par des caractères multioctets (comme Ä ou ):

ls | iconv -f utf8-mac -t utf-8 | LC_CTYPE=UTF-8 cut -c1 | uniq | while IFS= read -r l; do
  f=("$l"*)
  mkdir -- "$l"
  mv -- "${f[@]}" "$l"
done

iconv -f utf8-mac -t utf-8 convertit le texte d'une forme partiellement décomposée utilisée par HFS+ en une forme précomposée. Voir Encodages de texte dans VFS ou cette question. LC_CTYPE=UTF-8 fait en sorte que cut -c1 considère les caractères multioctets comme des caractères uniques.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X