Como dividir um diretório de arquivos em subdiretórios

1

Eu tenho um diretório cheio de arquivos semelhantes a estes:

3260_661901_2008-2008.dat
3260_661901_2009-2009.dat
3260_661901_2010-2010.dat
3260_661901_2011-2011.dat
3260_661901_por-1998.dat
3260_662336_1999-1999.dat
3260_662336_2000-2000.dat
3260_662336_2001-2001.dat
3260_662336_2002-2002.dat

Eu gostaria de dividir os arquivos em nomes de diretórios após o 6º e 7º caractere no nome do arquivo como este:

66/3260_661901_2008-2008.dat
66/3260_661901_2009-2009.dat
66/3260_661901_2010-2010.dat
66/3260_661901_2011-2011.dat
67/3260_671901_por-1998.dat
67/3260_672336_1999-1999.dat
67/3260_672336_2000-2000.dat
88/3260_882336_2001-2001.dat
88/3260_882336_2002-2002.dat

Existe um comando de liner rápido que posso usar para criar os subdiretórios e mover os arquivos para eles?

Devo mencionar que o diretório tem mais de 33k arquivos nele.

    
por Justin808 09.09.2015 / 09:52

2 respostas

1

tente

ls |  awk '{d=substr($0,6,2) ; printf "mkdir %s ; mv %s %s\n",d,$1,d }' | bash
  • nesse caso, você pode usar o resultado ls como entrada.
  • você receberá uma mensagem de erro como dir existe após o primeiro mkdir , para se livrar do uso:

    awk '{d=substr($0,6,2) ; printf "test -d %s || mkdir %s ; mv %s %s\n",d,d,$1,d }'
    
por 09.09.2015 / 10:03
5

Supondo que você esteja usando bash , você pode executar

for f in *.dat; do mkdir -p "${f:5:2}"; mv "$f" "${f:5:2}/"; done

ou (se houver arquivos demais para for f in *.dat funcionar)

while read f; do mkdir -p "${f:5:2}"; mv "$f" "${f:5:2}/"; done < ls
    
por 09.09.2015 / 10:10

Tags