使用脚本删除zip子目录中的文件,其中包含名称空格

时间:2013-06-23 13:00:03

标签: bash zip pipe subdirectory delete-file

我想编写一个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存档中删除文件。

1 个答案:

答案 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修剪了前导和尾随空格。)