Mover vários arquivos para vários diretórios

0

Eu tenho um diretório como segue

-rw-r--r-- 1 ualaoip2 mcm1    1073233 Sep 30 12:40 database.260.4-0.tar.gz
-rw-r--r-- 1 ualaoip2 mcm1  502373963 Sep 30 12:40 database.260.4-1.tar.gz
-rw-r--r-- 1 ualaoip2 mcm1  880379753 Sep 30 12:40 database.260.4-2.tar.gz
drwxr-xr-x 2 ualaoip2 mcm1       4096 Sep 30 13:41 db0file
drwxr-xr-x 2 ualaoip2 mcm1       4096 Sep 30 13:41 db1file
drwxr-xr-x 2 ualaoip2 mcm1       4096 Sep 30 13:41 db2file

e quero mover o arquivo database...0 para folder0 & c ...

Qual é a melhor maneira de fazer isso? Eu tentei várias variantes de

for i in $(ls fi*) do; mv $i ./folder$i

mas eles renomearam as coisas e substituíram muitas coisas que eu não queria!

Eu tentei usar variantes de

find . -maxdepth 1 -type d -printf '%f\n' | sort /* why is it not sorted?

mas não conseguiu se livrar do. para o diretório atual.

Eu usei o mkdir db {0..7} para criar os arquivos - essa é a melhor maneira?

Eu apreciaria algumas palavras de explicação com a resposta - não apenas um macaco, macaco! : -)

    
por Vérace 30.09.2017 / 14:55

2 respostas

0

Se você pode depender do formato do nome do arquivo, existe o seu comando:

for i in $(seq 0 2); do mv database*-"$i".tar.gz "db${i}file"/; done

Existe a descrição. Seus arquivos parecem ter formato estável database*-NUMBER.tar.gz e o mesmo número está no nome do diretório dbNUMBERfile . Podemos apenas gerar números até o mais alto (neste exemplo, 0..2 e executar por ciclo para esses números. No caso de banco de dados simples, $i é suficiente, pois é limitado por - e . , porém db$ifile não funcionaria, pois não há $ifile variável definida. Portanto, temos que usar chaves db${i}file , então o $i está devidamente resolvido.

    
por 30.09.2017 / 15:04
0
set -o nullglob

for name in database*-*[0-9].tar.gz; do
    num=${name##*-}
    num=${num%%.*}

    [ ! -d "folder$num" ] && mkdir "folder$num"

    mv "$name" "folder$num"
done

Isso iterará todos os nomes de arquivos que corresponderem ao padrão database*-*[0-9].tar.gz .

A variável num será o número no final do nome do arquivo (o número pode ter mais de um dígito) e é escolhido a partir do nome do arquivo removendo tudo desde o nome até e incluindo o último - e, em seguida, removendo o ponto e tudo mais depois.

As pastas de destino são criadas, se elas ainda não existirem.

Ao definir a opção nullglob shell para bash primeiro, garantimos que não entraremos no loop se o padrão não corresponder a nenhum nome de arquivo.

Você pode alterar o padrão para apenas database*.tar.gz , se desejar. Eu usei um padrão um pouco mais complicado para ter certeza de que todos os componentes do nome estão presentes e que são realmente usados pelo loop.

    
por 30.09.2017 / 16:30