生の入力:
➜ 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)を使用しています。
このスクリプトのようなもので作業を行うことができます。
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
をディレクトリツリーの開始点に置き換えます
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 ';'
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 .)