Batch renomeando arquivos 32000 - dividindo em vários subdiretórios

1

Eu tenho um servidor web que tem arquivos enviados para ele. Existe um script que atribui IDs numéricos e os armazena em um subdiretório correspondente.

Agora, tenho 32000 desses uploads e isso é demais para o servidor manipular em um diretório. O script que estou usando tem uma maneira de fazer o "namespace" de uploads, de modo que o ID 12345 - em vez de ficar em /files/12345 - ficaria em /files/namespaced/000/012/345 .

O código pode lidar com isso muito bem, mas agora eu tenho 32000 subdiretórios no estilo de nomeação errado. Qual é a maneira mais fácil de acessar meus arquivos existentes e colocá-los no lugar certo?

    
por Gareth 14.06.2010 / 12:58

2 respostas

1

Isso pressupõe que os nomes dos diretórios não tenham nenhum caractere estranho, como espaços ou novas linhas em seus nomes, e que não haja nomes de arquivos que iniciem com um ponto.

Não testado.

find /files -type d | while read -r dir
do
    base="000000${dir##*/}"
    new="/files/namespaced/${base: -9:3}/${base: -6:3}/${base: -3}"
    mkdir -p "$new"
    mv "$dir/*" "$new"
    rmdir "$dir"
done

Outra maneira de obter o novo nome do diretório:

new=$(echo "$dir" | sed 's|...$|/&|;s|\(.*\)/\(.*\)/\(...\)$|/namespaced/000000/|; s|\(.*\)/.*\(...\)\(...\)/\(...\)$|///|' "$dir")
    
por 14.06.2010 / 13:41
0

Eu fiz isso de maneira mais manual. os arquivos estavam no nível básico e eu criei todas as pastas e copiei manualmente 1.000 arquivos jpg de cada vez em cada pasta. Uma parte do script bash foi

mkdir 1-1000 1001-1999 2000-2999 3000-3999
ls *.jpg | head -1000 | while read line; do mv "$line" "1-1000"; done 

Eu apenas repito manualmente o comando com outra pasta até terminar Eu também apenas renomeia os arquivos para uma string sha1 se a ordem dos arquivos não for importante.

    
por 07.03.2018 / 00:44