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


1

我使用了>>
logsave path / log.txt find。 -name“* .zip”-exec sh -c'unzip -l {} |头-n 7'\;获取特定文件夹中zip文件内的文件列表。如果文件名包含一个或多个空格,它只是跳过文件,这是一个问题。 Dir结构是


迪尔..

.......... File1.zip **名称中没有空格

........... Fi le2.zip **名称中有空格

............我是3.zip **,名称中有空格

对于上述情况,仅列出file1.zip中的文件名。谁能推荐一个解决方案。

Answers:


2

尝试将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"

赢得! unzip 现在将尝试打开zip文件“File A.zip”并列出其内容。


谢谢..一个简单但有效的改变。你能解释一下如何用引号来忽略空格。
shekhar

我已经更新了我的答案,试着解释为什么需要报价。
Joakim Nohlgård
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.