Como compactar e renomear uma árvore de diretórios

1

Eu tenho muita música em muitos diretórios:

./artist1/album1/*.mp3
./artist1/album2/*.mp3
./artist1/album3/*.mp3
./artist2/album1/*.mp3
./artist2/album2/*.mp3
./artist3/album1/*.mp3
./artist3/album2/*.mp3
... ...

Como posso compactá-los para isso:

./artist1/album1/*.mp3  => ./artist1-album1.tar.gz
./artist1/album2/*.mp3  => ./artist1-album2.tar.gz
./artist1/album3/*.mp3  => ./artist1-album3.tar.gz
./artist2/album1/*.mp3  => ./artist2-album1.tar.gz
./artist2/album2/*.mp3  => ./artist2-album2.tar.gz
./artist3/album1/*.mp3  => ./artist3-album1.tar.gz
./artist3/album2/*.mp3  => ./artist3-album2.tar.gz
... ...

Eu gostaria de um comando de uma linha ou um script simples.

    
por kev 30.12.2010 / 10:15

1 resposta

2

tar :

for dir in */*/; do dir=${dir%/}; tar cf "${dir//\//-}.tar" "$dir"; done

zip :

for dir in */*/; do dir=${dir%/}; zip -0r "${dir//\//-}.zip" "$dir"; done

Os arquivos MP3 contêm dados já compactados, que não podem ser comprimidos ainda mais - o melhor que você obterá é ~ 2%, e seria muitas vezes mais lento - então o primeiro exemplo é apenas um arquivo tar .

Se você ainda quiser a compactação Gzip, adicione uma opção z (como em tar czf ) e substitua .tar por .tar.gz . Da mesma forma, a opção -0 para zip desativa a compactação - altere -0r para -r para reativar.

${dir%/} remove o final / de $dir

${dir//\//-} substitui todos os / por -

    
por 30.12.2010 / 13:12

Tags