从 .zip 文件中删除不区分大小写的文件名

从 .zip 文件中删除不区分大小写的文件名

我很感谢大家的反馈,尤其是关于如何提出更好的问题。我一直在阅读有关更好的礼仪的更多信息,希望现在我没有违反任何规则。但我意识到我最初的问题措辞不当。通过这个练习,我学到了很多东西,但最终,我花了更少的时间来列出有问题的文件,并手动删除垃圾图像。感谢大家的帮助!我正在转向更有价值的利用我的时间。

我在子目录中有数千个.zip文件,其中包含一些不同的错误图像,我们将其称为crap.*。但它们的文件名大小写不同。这些文件的扩展名可能不同,并且在 前面或后面可能有一些额外的字符crap,例如123crap567.jpg-crap-.gif

我正在尝试为 Linux 编写一个 bash 脚本来扫描目录,找到带有 的 zip 文件CrAp.PNG,然后从 zip 文件中删除该文件。下面是我目前得到的代码,但它不起作用。

我相信我正在扫描并找到正确的 zip 文件,并确定“垃圾文件”的确切名称。但我得到了:

zip 错误:无效的命令参数(仅指定一个操作)

我究竟做错了什么?

for i in *.zip; do
    [ -f "$i" ] || break
    f=$(zipinfo "$i" | grep -i -ho "\S*crap\S*")
    if [[ $f ]]; then
      zipinfo "$i" | grep -i -ho "\S*crap\S*" | xargs zip -d \'\*\/$i\'
    fi
done

答案1

打印出每个“$f”的值,它很可能是错误的。zipinfo我使用的版本会打印很多行和你不需要的信息 - 包括文件信息 - 因此 grep 可能无法正确生成文件名:

$ zipinfo  zip_with_zips.zip
Archive:  zip_with_zips.zip
Zip file size: 234464 bytes, number of entries: 4
-rw-a--     6.3 fat      310 bx defN 22-Jan-27 16:22 2.txt

尝试zipinfo -1 "$i"在每个地方仅显示文件名,并zip -d "$i"在最后显示:

f=$(zipinfo -1 "$i" | grep -i -ho "\S*crap\S*")
if [[ $f ]]; then
  zipinfo -1 "$i" | grep -i -ho "\S*crap\S*" | xargs zip -d "$i"
fi

相关内容