我有一个目录或压缩文件,每个文件包含一组XML文件 我需要制作一个脚本,如果它们包含某个字符串,将从这些ZIP中提取XML文件
for z in `ls /path/to/archives/*.zip`
do for f in `unzip -l $z | grep 'xml' | awk -F" " '{print "$4" "$5}'`
do r = $( unzip -p $z $f | grep $string )
if [ '$r' != '' ]
unzip $z $f
fi
done
done
运行时,包含名为“ my file.xml”的文件的zip文件A.zip导致循环将其作为2个文件“ my”和“ file.xml”来处理 然后解压缩然后尝试从A.zip提取文件my失败
关于如何强制for循环不将文件名中的空格视为分隔符的任何想法?
答案 0 :(得分:2)
使用-Z1
的{{1}}选项代替unzip
。每行输出一个文件,没有其他信息。您应该读取其输出,而不是使用for进行循环,以防止单词分裂。您可能仍然对包含换行符的文件名有疑问(但是我无法压缩它们,-l
被存储为$'a\nb'
,并被提取为a^Jb
)。
此外,您的ab
缺少if
。
此外,不要解析then
的输出,您可以遍历全局文件掩码本身。
您无需检查ls
是否输出任何内容,只需使用grep
运行并检查其退出状态即可。
不要忘记将可能包含空格或其他特殊字符的变量双引号。
-q