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
我有一个目录或压缩文件,每个包含一组 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