【问题标题】:Zip together files that have filenames that match recursively through directories将文件名通过目录递归匹配的文件压缩在一起
【发布时间】:2019-09-01 12:14:56
【问题描述】:

考虑一个像这样的文件系统:

folderA
   - one.png
   - two.png
   - three.png

folderB
   - one.png
   - two.png
   - three.png

folderC
   - one.png
   - two.png
   - three.png

我想将所有与 one.png 匹配的 .png 压缩到一个名为 one.zip 的 .zip 文件中。需要注意的是,它应该只专门搜索文件名而不是查看文件内部,因为生成这些 .png 的代码已经存在,我不想匹配任何不是实际 .png 的内容。

我尝试搜索,但使用我知道使用的关键字,我得到了很多关于在 .zip 文件中搜索 的结果。

我在 OSX Mojave 上。非常感谢任何帮助!

谢谢, 阿迪

【问题讨论】:

  • 脚本的奖励积分将为所有 onetwothree 创建压缩文件,我可以在其中指定实际文件名。

标签: bash unix terminal find zip


【解决方案1】:
base='one'
mapfile -t files < <(find . -name "${base}.png")
zip "${base}.zip" "${files[@]}"

【讨论】:

  • OP 使用的是 macOS Mojave,并且随附的 bash 版本(3.2.57(1)-release)不包含 mapfile 内置命令。
  • @user3439894 我正在使用 macOS High Sierra(Mojave 之前的那个),并且我正在运行的 bash 版本(4.4.12(1)-release)确实包含 mapfile,所以我希望它也是即使她必须安装它,OP 也可以使用它。
  • macOS High Sierra 附带bash 3.2.57(1)-release,并不是每个人都像你那样升级bash。我要说明的一点是,您给出的答案在 macOS 上不起作用,除非升级到包含 mapfile 内置命令的 bash 版本,因此您应该在答案中说明需要升级bash。您可能还应该包括如何做到这一点。
  • 嗨@EdMorton,所以您的解决方案几乎有效。问题是它保留了文件周围的文件夹结构。例如,当我编写脚本并运行它时,我会得到一个打开的 zip,它看起来像这样: ``` folderA -one.png folderB -one.png folderC -one.png ``` 我希望它出来一个只有.png的文件夹,没有别的。
  • 如果没有,那么 folderB/one.png 将覆盖 folderA/one.png 等等。如果这符合您在问题中的要求(并且 AFAIK 确实如此),那么您应该接受这个答案(请参阅stackoverflow.com/help/someone-answers),然后如果您不确定如何处理,请提出一个新问题。
【解决方案2】:

好吧,你可以疯狂地将所有one.png文件放入one.zip,将所有two.png文件放入two.zip,等等:

for file in $( find -name \*.png | sed 's:.*/::' | sort -u ); do
    zip $(basename $file .png).zip $( find -name $file )
done

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 1970-01-01
  • 2011-05-30
相关资源
最近更新 更多