for循环浏览名称中带有空格的文件

时间:2018-11-07 10:53:51

标签: bash for-loop space

我有一个目录或压缩文件,每个文件包含一组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循环不将文件名中的空格视为分隔符的任何想法?

1 个答案:

答案 0 :(得分:2)

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

此外,您的ab缺少if

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

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

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

-q