Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash for循环遍历名称中带有空格的文件_Bash_For Loop_Space - Fatal编程技术网

Bash for循环遍历名称中带有空格的文件

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' != '' ]

我有一个目录或压缩文件,每个目录或压缩文件包含一组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' != '' ]
    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不会显示)