recursivamente descompactar nomes de arquivos com espaços no linux e salvar log

1

Eu usei > >
caminho do caminho de log / log.txt encontrar. -name "* .zip" -exec sh -c 'unzip -l {} | cabeça -n 7 '\; para obter a lista de arquivos dentro de arquivos zip em uma pasta específica. Aqui está um problema se o nome do arquivo contiver um ou mais espaços é apenas pular os arquivos. Estrutura Dir é

Dir ..

.......... Arquivo1.zip ** sem espaço no nome

.......... Fi le2.zip ** Com espaço no nome

........... F i l e 3.zip ** com espaços no nome

Para os nomes de arquivos de casos acima, em file1.zip, está listado apenas. Alguém pode recomendar uma solução.

    
por shekhar 07.11.2012 / 15:46

1 resposta

2

Tente colocar seus nomes de arquivos entre aspas, para que o unzip saiba que é apenas um nome de arquivo:

find . -name "*.zip" -exec sh -c 'unzip -l "{}" | head -n 7' \; 

A razão pela qual precisamos citar o {} no comando acima é que estamos passando uma string para sh para ser executada como uma linha de comando.

Vou tentar explicar o que está acontecendo passo a passo:

Para cada arquivo que corresponde a * .zip, executaremos o comando sh -c 'unzip -l "{}" | head -n 7 . sh -c 'blahblablah' pega o argumento depois de -c e o executa como se tivesse sido inserido na linha de comando.

Então, dado um nome de arquivo File A.zip (com um espaço), vamos executar a linha de comando:

unzip -l File A.zip | head -n 7

Agora, o que acontece quando não citamos o nome do arquivo é que antes de chamar unzip, o shell dividirá a lista de argumentos em argumentos separados, resultando em uma lista:

"unzip" "-l" "File" "A.zip"

, o que significa que unzip tentará abrir o arquivo zip File e procurar o item A.zip dentro do arquivo.

Se colocarmos o argumento entre aspas, o shell será expandido para a seguinte lista de argumentos:

"unzip" "-l" "File A.zip"

Ganhe! unzip agora tentará abrir o arquivo zip "Arquivo A.zip" e listar seu conteúdo.

    
por 07.11.2012 / 16:22

Tags