bash - for 循环遍历名称中带有空格的文件
问题描述
我有一个目录或压缩文件,每个都包含一组 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
当它运行时,包含名为“my file.xml”的文件的压缩文件 A.zip 会导致循环将其作为 2 个文件“my”和“file.xml”解压缩然后尝试从 A.zip 中提取文件 my 失败
关于如何强制 for 循环不将文件名中的空格视为分隔符的任何想法?
解决方案
使用-Z1
选项unzip
而不是-l
。它每行输出一个文件,没有附加信息。您应该阅读它的输出而不是使用 for 循环它以防止分词。您可能仍然对包含换行符的文件名有问题(但我无法压缩它们,$'a\nb'
存储为a^Jb
并提取为ab
)。
另外,您if
缺少一个then
.
另外,不要解析 的输出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
推荐阅读
- cordova - 离子离子导航条透明
- vue.js - Vue:强制子组件对其属性的更改做出反应(这是一个字典)
- angular - 错误:无法解析 ApplicationModule 的所有参数:(?)
- javascript - 如何在不使用焦点的情况下从中间或末端的某处滚动顶部的 extJS 网格
- plsql - PL/SQL:clob 字符串中的动态查询。如何打开游标?
- spring - 带有字符串数组的 Setter 依赖注入
- entity-framework - 在 REST API 中实现多参数过滤器的最简洁方法
- php - Php get website url after https:// or www. or subdomain
- ubuntu - Ubuntu 18.04.1 LTS 服务器“存储库未签名”
- function - 在 main 中调用函数