0

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

4

1 回答 1

0

在变量中嵌入转义不会做任何事情,因为外壳会在扩展变量之前解释引号和转义(即,当转义出现时,它做任何事情都为时已晚)。相反,将变量引用放在双引号中,以防止 shell 将空格解释为分词。我还没有测试过,但这应该可以工作:

for file in *.cbz
do
  zip -sf "$file" | grep banner | { while read p; do  zip -d "$file" "$p" ; done }
done

(请注意,我还删除了该sed命令,因为read修剪了前导和尾随空格。)

于 2013-06-23T19:46:34.920 回答