オリジナル入力:
➜ 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 .)