在这样的文件系统结构中:
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 脚本名称(在我的例子中,它只是一个字符串)
basename
和dirname
避免(阅读更多这里)- 这种语法
... {} \;
会调用与结果一样多的 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 保留在当前工作目录中。