我有以下目录结构:
/Data
- file 1
- file 2
/Folder1
- file 3
- file 4
/Folder2
- file 5
- file 6
/Folder3
- file 7
- file 8
在 Linux 中,我想压缩每个目录中的文件(不包括文件夹),并在每个文件夹中创建一个 7z(或 zip)存档,结果如下:
/Data
Data.7z (Note: this should contain only file1 & 2, not any sub directories)
/Folder1
Folder1.7z (this should contain only file3 & 4, not any sub directories)
/Folder2
Folder2.7z (this should contain only file5 & 6, no Folder3)
/Folder3
Folder3.7z (should contain only file7 & 8)
以下脚本适用于第一个目录,但不适用于子目录:
for i in */ ; do base=$(basename “$i”) ; cd $base ; 7za a -t7z -r $base * ; .. ; cd .. ; done;
我怎样才能做到这一点?
如果你想使用
7z
,棘手的部分似乎是说服它不要递归;文档中指示的-r-
开关似乎不起作用,软件作者建议的解决方法是使用通配符表达式排除子目录-x!*/
所以,给定
然后
结果是
例如,我们可以使用以下方法检查
Folder2.7z
仅包含其自己文件夹的文件注意:可能需要在历史扩展运算符
!*/
所在的环境(例如交互式 bash shell)中进行额外的转义。!
这是未经测试的代码,仅与“echo”一起使用,因为我不喜欢以多个 zip 文件结尾。它是幻想的 zip 语法,因为我不知道 7za,但我会解释一下:
脚本 ad-hoc.sh 必须使用绝对路径进行寻址,并且不应位于当前路径中,以免影响结果,但它可能位于 parentdir 中:
并且,如果不是可执行的,则显式调用:
Find 将在当前目录中查找,仅查找类型为 d (dirs) 的文件,在哪里 - 执行带有参数 {} 的 bashscript,即找到的目录。
好的 - 什么是 ad-hoc.sh,我们在 dir 和 subdirs 中执行?这是另一个发现:
-maxdepth 1 阻止 find 搜索子目录,-type 表示只对文件进行操作。-exec 启动一个命令,用于测试“echo zip ...”,但如果它看起来很有希望(你经常做备份,不是吗?),你 - 好吧,这里开始我的伪代码:-o:= -output "$PWD.zip", {} + 是文件列表。
每个带有扩展名的文件都是一个普通文件,每个没有扩展名的文件都是一个目录或指向目录 (up3) 的符号链接。
{} 必须是 find -exec 命令在终止“;”之前的最后一个元素 或+,所以你必须相应地构建你的7z命令。
所以如果你的 7za 命令是
ad-hoc.sh 可能如下所示: