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.