bash loop de uma linha sobre diretórios gera erros

1

Eu estou tentando construir um bash one-liner para fazer um loop sobre os diretórios dentro do diretório atual e colocar o conteúdo em tars únicos, usando o nome do diretório como o nome do arquivo tar. Eu tenho o básico de trabalho (encontrar os nomes de diretório e tarring-los com esses nomes), mas meu loop lança algumas mensagens de erro e não consigo entender onde está recebendo os comandos tentando executar.

Aqui está o one-liner mais usado:

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

Qual parte do comando que estou executando não entendo e gerando essa saída?

    
por cori 28.01.2010 / 05:45

3 respostas

3

Você precisa remover os backtics em torno do comando tar . Você também pode querer canalizar o ls através do xargs para ter certeza de que o bash pega 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 de tar e tentando executá-la como um comando em cada iteração do loop. A primeira coisa que o tar imprime quando você usa uma opção -v são as permissões em cada arquivo (por exemplo, drwxrwxr-x ). Neste caso, você quer bash para executar o comando tar, não capturar a saída.

    
por 28.01.2010 / 05:54
2
O

bjlaub está correto em relação aos backticks em torno de tar , mas você não precisa usar ls :

for file in */

fará o truque e manipulará corretamente nomes de diretório com espaços.

    
por 28.01.2010 / 06:18
1

As outras respostas aqui são boas, mas eu queria adicionar outra opção caso você precise apenas de 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 isso ajude!

    
por 04.01.2011 / 22:22