bash loop de uma linha sobre diretórios gera erros

bash loop de uma linha sobre diretórios gera erros

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 tarcomando. Você também pode querer fazer isso lspara xargsgarantir 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 tare tentando executá-la como um comando em cada iteração do loop. A primeira coisa tarque é 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!

informação relacionada