Bash for循环遍历名称中带有空格的文件
我有一个目录或压缩文件,每个目录或压缩文件包含一组XML文件 我需要制作一个脚本,如果这些ZIP包含某个字符串,它将从这些ZIP中提取XML文件Bash for循环遍历名称中带有空格的文件,bash,for-loop,space,Bash,For Loop,Space,我有一个目录或压缩文件,每个目录或压缩文件包含一组XML文件 我需要制作一个脚本,如果这些ZIP包含某个字符串,它将从这些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' != '' ]
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
运行时,zip文件A.zip包含一个名为“my file.xml”的文件,使循环将其作为两个文件“my”和“file.xml”处理
解压然后尝试从.zip中提取我的文件,但失败
如何强制for循环不考虑文件名中的空间作为分隔符?
使用<代码> -Z1<代码>选项>代码> unZip < /C> >而不是<代码> -L/COD>。它每行输出一个文件,没有附加信息。您应该读取其输出,而不是使用for循环,以防止分词。您可能仍然对包含换行符的文件名有问题(但我无法压缩它们,$'a\nb'
存储为a^Jb
,提取为ab
)
另外,如果缺少,则
另外,不要解析ls
的输出,您可以迭代全局文件掩码本身
您不需要检查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
用于z in/path/to/archives/*.zip;做
而IFS=read-rf;做
如果解压缩-p“$z”$f“| grep-q“$string”;然后
解压缩“$z”$f”
fi
完成<使用解压的-Z1
选项,而不是-l
。它每行输出一个文件,没有附加信息。您应该读取其输出,而不是使用for循环,以防止分词。您可能仍然对包含换行符的文件名有问题(但我无法压缩它们,$'a\nb'
存储为a^Jb
,提取为ab
)
另外,如果缺少,则
另外,不要解析ls
的输出,您可以迭代全局文件掩码本身
您不需要检查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
用于z in/path/to/archives/*.zip;做
而IFS=read-rf;做
如果解压缩-p“$z”$f“| grep-q“$string”;然后
解压缩“$z”$f”
fi
完成<伟大的剧本!顺便说一句,当IFS=read-rf
比当read f
更安全时,他说他错过了空格的引号,留下来看性感的剧本+1工作得很有魅力!谢谢choroba、Kamil Cuk和MeetTitan:)+1(尽管stackoverflow不会显示)很棒的脚本!顺便说一句,当IFS=read-rf
比当read f
更安全时,他说他错过了空格的引号,留下来看性感的剧本+1工作得很有魅力!谢谢choroba,Kamil Cuk和MeetTitan:)+1(尽管stackoverflow不会显示)