我想编写一个bash脚本,在我不知道确切位置的情况下从zip存档中删除某些文件。
我到目前为止:
for file in *.cbz
do
zip -sf "$file" | grep banner | sed 's/^ *//g' | { while read p; do zip -d $file ${p// /\\ } ; done }
done
我背后的想法:
zip -sf "$file"
给我档案中的所有文件
| grep banner
这只让我了解我感兴趣的行。
| sed 's/^ *//g'
我管道其余的sed以摆脱前导空格
| { while read p; do zip -d $file ${p// /\\ } ; done }
其余行通过管道传输,使用抓取的路径+文件名对存档执行zip删除。 $ {p // / \}应该转义空格,因为简单地使用$ p将导致zip与名称之间的空格作为文件列表。
然而,转义空间也是如此,所以我想真正的问题是如果文件名包含空格,如何从zip存档中删除文件。
答案 0 :(得分:0)
在变量中嵌入转义并不做任何事情,因为shell在扩展变量之前解释了引号和转义(即在转义之前,它已经太晚了,它已经太晚了做任何好事)。相反,将变量引用放在双引号中以防止shell将空格解释为单词分隔符。我还没有对它进行测试,但这应该可行:
for file in *.cbz
do
zip -sf "$file" | grep banner | { while read p; do zip -d "$file" "$p" ; done }
done
(请注意,我还删除了sed
命令,因为read
修剪了前导和尾随空格。)