
Estou tentando construir um bash one-liner para percorrer os diretórios dentro do diretório atual e tar o conteúdo em tars exclusivos, usando o nome do diretório como o nome do arquivo tar. Eu tenho o básico funcionando (encontrar os nomes dos diretórios e adicioná-los a esses nomes), mas meu loop lança algumas mensagens de erro e não consigo entender de onde ele está obtendo os comandos que está tentando executar.
Aqui está a frase que mais funciona:
for f in `ls -d */`; do `tar -czvvf ${f%/}.tar.gz $f`;done
A saída "estranha" é:
-bash: drwxrwxr-x: command not found
-bash: drwxr-xr-x: command not found
-bash: drwxr-xr-x: command not found
-bash: drwxrwxr-x: command not found
Que parte do comando que estou executando não entendo e que está gerando essa saída?
Responder1
Você precisa remover os backtics em torno do seu tar
comando. Você também pode querer fazer isso ls
para xargs
garantir que o bash selecione todos os diretórios corretamente:
for f in `ls -d */ | xargs`; do tar -cvzf ${f%/}.tar.gz $f; done
Os backticks estão capturando a saída tar
e tentando executá-la como um comando em cada iteração do loop. A primeira coisa tar
que é impressa quando você usa a opção -v são as permissões em cada arquivo (por exemplo, o drwxrwxr-x
). Neste caso, você quer que o bashexecutaro comando tar, não captura a saída.
Responder2
bjlaubestá correto em relação aos crases tar
, mas você não precisa usar ls
:
for file in */
resolverá o problema e tratará adequadamente os nomes de diretório com espaços.
Responder3
As outras respostas aqui são boas, mas eu queria adicionar outra opção caso você precise obter apenas diretórios e não links simbólicos, etc:
for f in `find -maxdepth 1 -type d` | do -cvzf ${f%/}.tar.gz $f; done
Espero que isto ajude!