for 遍历名称中包含空格的文件

for loop through files with spaces in their names

我有一个目录或压缩文件,每个包含一组 XML 个文件 我需要制作一个脚本,如果它们包含特定字符串

,将从这些 ZIP 中提取 XML 文件
for z in `ls /path/to/archives/*.zip`
do for f in `unzip -l $z | grep 'xml' | awk -F" " '{print "" "}'`
  do r = $( unzip -p $z $f | grep $string )
    if [ '$r' != '' ]
    unzip $z $f
    fi
  done
done

运行时,zip 文件 A.zip 包含一个名为 'my file.xml' 的文件,导致循环将其作为 2 个文件 'my' 和 'file.xml' 处理 unzip 然后尝试从 A.zip 中提取我的文件,但失败了

关于如何强制 for 循环不将文件名中的 space 视为分隔符的任何想法?

使用 unzip-Z1 选项代替 -l。它每行输出一个文件,没有附加信息。您应该读取它的输出而不是用 for 循环它以防止分词。您可能仍然对包含换行符的文件名有问题(但我无法压缩它们,$'a\nb' 存储为 a^Jb 并提取为 ab)。

此外,您的 if 缺少一个 then

此外,不要解析 ls 的输出,您可以遍历 globbed 文件掩码本身。

您不需要检查 grep 是否输出任何内容,只需 运行 使用 -q 并检查其退出状态即可。

不要忘记对可能包含空格或其他特殊字符的变量加双引号。

for z in /path/to/archives/*.zip ; do
    while IFS= read -r f ;  do
        if unzip -p "$z" "$f" | grep -q "$string" ; then
            unzip "$z" "$f"
        fi
    done < <(unzip -Z1 "$z" '*.xml')
done