Move todos os arquivos para subdiretórios nomeados após o início do nome do arquivo

2

Eu tenho um diretório que contém muitos arquivos com nomes compostos de oito letras aleatórias, números, _ e -, por exemplo:

0dckGYH5.jpg
32Pz5-WQ.png
32_17pxH.png
Hsf4BQW9.jpg
xh-fa3Nu.gif
zYtBEaKA.png
...

Agora, a tarefa é percorrer cada um dos arquivos, criar um diretório com o nome dos dois primeiros caracteres do nome do arquivo e mover o arquivo para esse diretório.

A estrutura final deve ser assim:

0d
└── 0dckGYH5.jpg
32
├── 32Pz5-WQ.png
└── 32_17pxH.png
Hs
└── Hsf4BQW9.jpg
xh
└── xh-fa3Nu.gif
zY
└── zYtBEaKA.png

Como não tenho permissão para instalar nada no sistema, como eu faria isso apenas com comandos básicos do shell?

    
por JangoBrick 12.07.2016 / 21:50

1 resposta

7

Uma combinação simples de mkdir -p e mv deve ser suficiente

for f in *; do d="${f:0:2}"; mkdir -p "$d"; mv -t "$d" -- "$f"; done

Demonstrando:

$ ls
0dckGYH5.jpg  32_17pxH.png  32Pz5-WQ.png  Hsf4BQW9.jpg  xh-fa3Nu.gif  zYtBEaKA.png

$ for f in *; do d="${f:0:2}"; mkdir -p "$d"; mv -t "$d" -- "$f"; done

$ tree .
.
├── 0d
│   └── 0dckGYH5.jpg
├── 32
│   ├── 32_17pxH.png
│   └── 32Pz5-WQ.png
├── Hs
│   └── Hsf4BQW9.jpg
├── xh
│   └── xh-fa3Nu.gif
└── zY
    └── zYtBEaKA.png

5 directories, 6 files

Se a versão do seu sistema de mkdir não tiver a opção -p , você poderá testar explicitamente a existência do diretório, por exemplo,

 for f in *; do d="${f:0:2}"; [[ -d "$d" ]] || mkdir "$d"; mv -t "$d" -- "$f"; done
    
por 12.07.2016 / 22:01