複数のサブフォルダ内のすべてのファイルを圧縮する方法は?

複数のサブフォルダ内のすべてのファイルを圧縮する方法は?

オリジナル入力:

    ➜  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

期待される出力

➜  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

サブフォルダ(s1/s2/s4)のファイルを圧縮したいです。

zip -r Archive.zip ./*各サブフォルダ(s1/s2/s4)でコマンドラインを試してみました。同じ命令を3回入力しなければならないので不便ですね。

ワンタイムコマンドを使用するか、スクリプトを作成してこれを達成するにはどうすればよいですか?私はOSX(10.12.6)を使用しています。

答え1

find . -type d -name data -execdir zip -jr data/Archive.zip data ';'

このコマンドは、現在のディレクトリの下の各ディレクトリをfind検索して実行します。data

zip -jr data/Archive.zip data

sNディレクトリ(ディレクトリの親ディレクトリdata)にあります。隠しファイルも保持されます。

フラグは-jアーカイブzipに追加されたファイルのパス名を削除し、アーカイブはdataディレクトリ内に配置されます。

-execdirこれは、デフォルトでcdは、コマンドを実行する前に見つかったエントリの親ディレクトリでタスクが実行されるために機能します。

s3このディレクトリを避けるには、次のようにします。

find . -type d -name data \! -path "./s3/*" -execdir zip -jr data/Archive.zip data ';'

答え2

次のスクリプトが操作を実行します。

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

PSは/pathディレクトリツリーの始点に置き換えられました。

答え3

POSIXly(明らかにコマンドを除くzip):

find . -path ./s3 -prune -o -type d -name data -exec sh -c '
   for dir do
     (cd "$dir" && zip -r Archive.zip .)
   done' sh {} +

または以下を使用してzsh -o extendedglob

for dir (./**/data~*/s3/*(/N)) (cd $dir && zip -r Archive.zip .)

dataまたは、フォルダを再帰的に検索したくない場合:

for dir (./^s3/data(/N)) (cd $dir && zip -r Archive.zip .)

またはより具体的に言えば(ここでは必要ありませんextendedglob):

for dir (s[124]/data(/N)) (cd $dir && zip -r Archive.zip .)

関連情報