agrupa arquivos em pastas por nome

3

Eu tenho uma pasta com muitos arquivos como:

20_1_A.xml,
20_2_A.xml,
20_3_A.xml,
...

10_1_A.xml,
10_2_A.xml,
10_3_A.xml,
...

20_1_A.csv,
20_2_A.csv,
20_3_A.csv,
...

10_1_A.csv,
10_1_A.csv,
10_3_A.csv,
...

Eu quero agrupar os arquivos pelo primeiro número no nome usando comandos shell. Por exemplo:

  • todos os arquivos que começam com 20 dentro de uma pasta chamada 20 e todos os arquivos que começam com 10 em uma pasta chamada 10. O tipo de arquivo não importa.

Alguém sabe como fazer isso? Pensei em usar curingas, mas não sei como…

    
por mor 10.03.2017 / 14:34

3 respostas

3

Caracteres curinga são a ferramenta certa. Você pode mover todos os arquivos assim:

for i in {10,20} # or something like $(seq 10 10 90) instead of {10,20} if you have a lot of different prefixes
do
    mkdir -p "$i" &&
      mv "$i"* "$i"/
done

Você deseja mkdir -p para que mkdir não reclame se o diretório de destino já existir.

    
por 10.03.2017 / 14:44
3
for datei in *_*.xml *_*.csv; 
 do mkdir -p -- "${datei%%_*}" && 
    mv -- "$datei" "${datei%%_*}"
 done

Para cada arquivo que corresponda aos padrões, crie um diretório nomeado pela parte antes do primeiro sublinhado (se já não existir, -p option) e mova o arquivo para lá.

Espero que isso se encaixa.

    
por 10.03.2017 / 14:52
2

com zsh :

mkdir_and_move() {mkdir -p -- $2:h && mv -- "$@"}
autoload zmv

zmv -P mkdir_and_move '(<->)*.(csv|xml)(#q.)' '$1/$f'

<-> é uma glob que corresponde a um inteiro decimal ( <x-y> é inteiros de x a y ). (#q.) é um qualificador glob que seleciona apenas arquivos regulares.

Semelhante ao que você faria com um loop, exceto que zmv adiciona algumas verificações de integridade.

    
por 10.03.2017 / 15:01

Tags