在Linux中递归解压缩带有空格的文件名并保存日志

在Linux中递归解压缩带有空格的文件名并保存日志

我使用 >>
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 7sh -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

相关内容