如何压缩许多第n级子目录,而不需要它们的顶级(父)目录?

如何压缩许多第n级子目录,而不需要它们的顶级(父)目录?

在这样的文件系统结构中:

root/
    |
    container1/
    |         |
    |         subdir2/
    |                |
    |                subdir3/
    |                       |
    |                       subdir4/
    |                              |
    |                              file1
    |                              file2
    |                              subdir5/
    container2/
              |...

我需要压缩所有内容:

  • 在“/subdir4/”下
  • 没有它/subdir4/本身
  • /container/在目录的所有潜在root/子目录中
  • 将 zip 命名为与所压缩内容的父文件夹相同的名称(在本例中为“subdir4.zip”)

请记住:

  • 这些不是目录和子目录的真实名称,它只是一个近似值
  • 我在 Mac OSX 上使用 ZSH
  • 我对 Unix/Linux 脚本编写很陌生

我真的很想要一个与 shell 无关的、简单的、循环类型的解决方案,这样我就可以尽可能多地学习,并灵活地针对其他潜在情况修改此解决方案。

这是我到目前为止所尝试过的,按照朋友的建议:

find . -mindepth 5 -maxdepth 5 -type d -exec sh -c '
pushd "$0/..";zip -rFS "$(basename "$0").zip" "$(basename "$0")";popd ' {} \;

同时,我了解到该解决方案有以下缺点:

  • $0 不应该用作位置参数,因为它用于错误报告和/或作为 shell 脚本名称(在我的例子中,它只是一个字符串)
  • basenamedirname避免(阅读更多这里
  • 这种语法... {} \;会调用与结果一样多的 shell,据说不是执行此类操作的有效方法

我应该一直使用:

  • 我的位置参数中的 $1
  • ... ;popd ' sh {} +

该结果应该以“数组/列表”的形式获取所有结果,并sh立即应用传递给所有结果的字符串中的命令。

谢谢!

奖励积分::)

  • 我可以将生成的 .zip 命名为/subdir3//subdir4/此层次结构中的名称相同的名称吗?

答案1

可以使用awk创建系统命令来执行

find * -mindepth 5 -maxdepth 5 -type d  | awk -F"/" '{system( "cd "$0"; zip -rF "$NF".zip *")}'

在 / 上分割-F行,$0代表完整的行并$NF具有您的实际目录名称。不需要 popd,因为系统命令在其自己的 shell 中执行,并且父 shell 保留在当前工作目录中。

相关内容