我使用 >>
logsave path/log.txt find . -name "*.zip" -exec sh -c 'unzip -l {} | head -n 7' \; 获取特定文件夹中 zip 文件内的文件列表。如果文件名包含一个或多个空格,则会出现问题,它会跳过这些文件。目录结构是
导演..
..........File1.zip **名称中没有空格
...........File2.zip **名称中有空格
...........文件 3.zip **名称中有空格
对于上述情况,仅列出了 file1.zip 中的文件名。有人可以推荐一个解决方案吗?
答案1
尝试将您的 zip 文件名括在引号中,以便 unzip 知道它只有一个文件名:
find . -name "*.zip" -exec sh -c 'unzip -l "{}" | head -n 7' \;
我们需要在上面的命令中引用 {} 的原因是我们将一个字符串传递给 sh 以作为命令行运行。
我将尝试逐步解释正在发生的事情:
对于每个与 .zip 匹配的文件,我们将运行命令sh -c 'unzip -l "{}" | head -n 7
。
sh -c 'blahblablah'
采用 -c 后的参数并运行它,就像在命令行中输入它一样。
因此给定一个文件名File A.zip
(带空格)我们将执行命令行:
unzip -l File A.zip | head -n 7
现在,当我们不引用文件名时,在调用 unzip 之前,shell 会将参数列表拆分为单独的参数,从而得到一个列表:
"unzip" "-l" "File" "A.zip"
这意味着unzip
将尝试打开 zip 文件并在档案中File
查找项目。A.zip
如果我们将参数括在引号中,则 shell 将扩展为以下参数列表:
"unzip" "-l" "File A.zip"
Win!unzip
现在将尝试打开 zip 文件“File A.zip”并列出其内容。
答案2
你可以使用它为了也。
for file in *.zip; do unzip -l "$file" | head -n 7; done