単一のディレクトリ内のすべてのディレクトリを自分の名前の付いたファイルに圧縮したいと思います。たとえば、tar-all.shを使用します。
dir___
|- dirA
|- dirB
|- tar-all.sh
~になる
dir___
|- dirA.tar.tgz
|- dirB.tar.tgz
|- tar-all.sh
答え1
for
ループを使用してください。
#!/bin/bash
for f in *
do
echo "Creating tarball of $f..."
tar -zcf $f.tar.gz $f
done
結果:
> ./tar-all.sh
> Creating tarball of tar-all.sh...
> Creating tarball of dirA...
> Creating tarball of dirB...
> DONE!
|- dirA.tar.tgz
|- dirB.tar.tgz
|- tar-all.sh.tar.gz
答え2
以下は、このディレクトリのすべてのサブディレクトリを見つけてアーカイブしますdir
(元のサブディレクトリを削除します)。
for subdir in dir/*/; do
dirname="$( basename "$subdir" )"
( cd "$dir" && tar -cz -f "$dirname.tgz" "$dirname" && rm -rf "$dirname" )
done
このパターンはdir/*/
その下のサブディレクトリのパス名とのみ一致し、dir
ディレクトリ以外のパス名とは一致しません/
。
または明示的な代わりに-C
オプションを使用してください。tar
cd
for subdir in dir/*/; do
dirname="$( basename "$subdir" )"
tar -cz -f "dir/$dirname.tgz" -C dir "$dirname" && rm -rf "$subdir"
done
テスト:
$ tree
.
`-- dir
|-- a
| `-- file
|-- b
| `-- file
|-- c
| `-- file
`-- complicated name
`-- file
5 directories, 4 files
(ここでは2つのループのうちの1つを実行してください)
$ tree
.
`-- dir
|-- a.tgz
|-- b.tgz
|-- c.tgz
`-- complicated name.tgz
1 directory, 4 files