web-dev-qa-db-ja.com

複数のサブフォルダーからすべてのファイルを圧縮するにはどうすればよいですか?

生の入力:

    ➜  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回入力しなければならないので不便です。

これを実現するために、コマンドを1回使用するか、スクリプトを作成するにはどうすればよいですか?私はOSX(10.12.6)を使用しています。

5
Jack

このスクリプトのようなもので作業を行うことができます。

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

P.S. /pathをディレクトリツリーの開始点に置き換えます

3
Romeo Ninov
find . -type d -name data -execdir Zip -jr data/Archive.Zip data ';'

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

Zip -jr data/Archive.Zip data

sNディレクトリ(dataディレクトリの親ディレクトリ)。これにより、隠しファイルもアーカイブされます。

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

これが機能するのは、-execdirが基本的にコマンドを実行する前に見つかったものの親ディレクトリに対してcdを実行するためです。

s3ディレクトリを回避するには、

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

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 .)
3