ディレクトリ内のすべてのディレクトリを圧縮ディレクトリの名前を付けたファイルに圧縮する方法

ディレクトリ内のすべてのディレクトリを圧縮ディレクトリの名前を付けたファイルに圧縮する方法

単一のディレクトリ内のすべてのディレクトリを自分の名前の付いたファイルに圧縮したいと思います。たとえば、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オプションを使用してください。tarcd

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

関連情報