如何压缩多个子文件夹中的所有文件?

Jac*_*ack 5 command-line zip compression shell-script

原始输入?

    ?  test tree
    .
    ??? f1.md
    ??? f2.md
    ??? f3.md
    ??? f4.txt
    ??? f5.csv
    ??? f6.doc
    ??? s1
    ?   ??? code
    ?   ??? data
    ?       ??? f1.md
    ?       ??? f2.md
    ?       ??? f3.md
    ?       ??? f4.txt
    ?       ??? f5.csv
    ?       ??? f6.doc
    ??? s2
    ?   ??? code
    ?   ??? data
    ?       ??? f1.md
    ?       ??? f2.md
    ?       ??? f3.md
    ?       ??? f4.txt
    ?       ??? f5.csv
    ?       ??? f6.doc
    ??? s3
    ?   ??? code
    ?   ??? data
    ?       ??? f1.md
    ?       ??? f2.md
    ?       ??? f3.md
    ?       ??? f4.txt
    ?       ??? f5.csv
    ?       ??? f6.doc
    ??? s4
        ??? code
        ??? data
            ??? f1.md
            ??? f2.md
            ??? f3.md
            ??? f4.txt
            ??? f5.csv
            ??? f6.doc

    12 directories, 30 files
Run Code Online (Sandbox Code Playgroud)

预期输出

?  test tree
.
??? f1.md
??? f2.md
??? f3.md
??? f4.txt
??? f5.csv
??? f6.doc
??? s1
?   ??? code
?   ??? data
?       ??? Archive.zip
?       ??? f1.md
?       ??? f2.md
?       ??? f3.md
?       ??? f4.txt
?       ??? f5.csv
?       ??? f6.doc
??? s2
?   ??? code
?   ??? data
?       ??? Archive.zip
?       ??? f1.md
?       ??? f2.md
?       ??? f3.md
?       ??? f4.txt
?       ??? f5.csv
?       ??? f6.doc
??? s3
?   ??? code
?   ??? data
?       ??? f1.md
?       ??? f2.md
?       ??? f3.md
?       ??? f4.txt
?       ??? f5.csv
?       ??? f6.doc
??? s4
    ??? code
    ??? data
        ??? Archive.zip
        ??? f1.md
        ??? f2.md
        ??? f3.md
        ??? f4.txt
        ??? f5.csv
        ??? f6.doc

12 directories, 33 files
Run Code Online (Sandbox Code Playgroud)

我想要压缩子文件夹(s1/s2/s4)中的文件。

我尝试zip -r Archive.zip ./*在每个子文件夹( s1/s2/s4) 中使用命令行。这很不方便,因为我必须输入 3 次相同的命令。

如何使用一次命令或编写脚本来实现此目的?我在 OSX(10.12.6) 上。

Kus*_*nda 5

find . -type d -name data -execdir zip -jr data/Archive.zip data ';'
Run Code Online (Sandbox Code Playgroud)

find命令会查找data当前目录下的各个目录并执行

zip -jr data/Archive.zip data
Run Code Online (Sandbox Code Playgroud)

在每个sN目录(目录的父data目录)中。这也将存档隐藏文件。

-j标志zip将剥离添加到存档和存档的文件的路径名将被放置在内部data的目录。

这是有效的,因为-execdir基本上cd在执行命令之前对找到的东西的父目录做了一个。

要避免s3目录,请使用

find . -type d -name data \! -path "./s3/*" -execdir zip -jr data/Archive.zip data ';'
Run Code Online (Sandbox Code Playgroud)


Rom*_*nov 3

像这样的脚本可以完成这项工作:

for i in `find /path -type d -name data`;
do
if [ "$i" = "s3/data" ]
 then continue
 else cd "$i" && zip Archive.zip *
fi
done
Run Code Online (Sandbox Code Playgroud)

PS 替换/path为目录树的起点