根据命令行中的文件夹将文件递归压缩到 .cbz 文件中

Mar*_*tin 2 zip bash automation terminal.app macos

我试图弄清楚如何编写一个脚本来自动从 OSX 上文件夹中的图像创建 .cbz 文件。

我的目录树将如下所示:

/toplevel/
cbz/
comics/
    Comic1/
        comic1file1.jpg
        comic1file2.gif
        comic1file3.png
    Comic2/
        comic2file1.jpg
        comic2file2.gif
    Publisher/
            Comic3/
                comic3file1.jpg
                comic3file2.gif
                comic3file3.png
            Comic4/
                comic4file1.jpg
                comic4file2.gif
Run Code Online (Sandbox Code Playgroud)

我想做的是运行一个脚本,该脚本将找到包含实际文件而不是子文件夹的任何文件夹并将其压缩,将其从 .zip 重命名为 .cbz 并将 .cbz 文件移动到顶层的 /cbz 文件夹。任何包含子文件夹的文件夹不应包含任何文件,因此这可能会有所帮助。另外,我不希望存在比上面示例中显示的更深的子文件夹。

我在哪里:此代码片段将查看文件夹并为每个子文件夹创建 .cbz 文件。

for dir in `ls`; do zip $dir $dir/*; mv $dir*zip $dir.cbz; done
Run Code Online (Sandbox Code Playgroud)

我还发现了一些片段,这些片段将执行与所选文件夹下的每个子文件夹类似的操作,但我得到了不同的结果,并且非常有兴趣了解仅对文件夹执行操作的最佳方法。另外,我不知道如何检查给定文件夹是否包含子文件夹或文件。(我想理想情况下我应该检查是否两者都存在,但对于我当前的情况来说,不应该是这种情况。)有什么想法吗?

slh*_*hck 5

另一个稍微不同的解决方案:

\n\n
#!/bin/bash\nfind toplevel/comics -type d -not -empty -print0 | while IFS= read -r -d \'\' dir; do\n  if find "$dir" -maxdepth 1 -type f | read f; then\n    zip toplevel/cbz/"$(basename "$dir").cbz" "$dir"/*\n  fi\ndone\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • find \xe2\x80\xa6\xc2\xa0-print0 |\xc2\xa0while IFS= read -r -d \'\' file是迭代结果的推荐模式find。做一个简单的find \xe2\x80\xa6 | while read file工作就可以了,但前提是返回的文件名不包含换行符。ls从来不建议解析。

  • \n
  • find "$dir" -maxdepth 1 -type f | read f仅当在目录中找到文件时才评估 true。它实现了与 @terdon\ 对 输出行数的评估相同的目的find

  • \n
  • 所有变量都需要加引号,以防止文件名中的空格破坏参数。

  • \n
\n