Este pequeno script parece ser sua melhor opção, considerando suas necessidades:
cd directory
for dir in */
do
base=$(basename "$dir")
tar -czf "${base}.tar.gz" "$dir"
done
Lida corretamente com diretórios com espaços em seus nomes.
Como eu seria capaz de compactar subdiretórios em arquivos separados?
Exemplo:
directory
subdir1
subdir2
Deverá criar subdir1 (.tar) .gz e subdir2 (.tar) .gz
Que tal isso: find * -maxdepth 0 -type d -exec tar czvf {}.tar.gz {} \; \;
Explicação: Você executa uma descoberta em todos os itens no diretório atual. Maxdepth 0 faz com que ele não seja menor que os argumentos fornecidos. (Neste caso *, ou todos os itens em seu diretório atual) O argumento 'd' para digitar corresponde apenas aos diretórios. Então exec executa tar em qualquer correspondência. ({} é substituído pelo arquivo correspondente)
Isto irá criar um arquivo chamado blah.tar.gz para cada arquivo em um diretório chamado blah.
$ cd directory
$ for dir in 'ls'; do tar -cvzf ${dir}.tar.gz ${dir}; done
Se você tiver mais que apenas diretórios no diretório (ou seja, arquivos também, como ls retornará tudo no diretório), use:
$ cd directory
$ for dir in 'find . -maxdepth 1 -type d | grep -v "^\.$" '; do tar -cvzf ${dir}.tar.gz ${dir}; done
O grep -v exclui o diretório atual que será exibido no comando find
por padrão.