フォルダに他のファイルを含めずにサブディレクトリのみを圧縮できますか?

フォルダに他のファイルを含めずにサブディレクトリのみを圧縮できますか?

A/B/Cたとえば、これがあなたのホームディレクトリであるとします。そのディレクトリ内にCサブディレクトリとファイルがあります。しかし、以下のように自分の名前を持つディレクトリだけを圧縮したいと思います。

c以下のディレクトリがTest1 Test2の場合 - Test1.tar Test2.tarになることを願っています。

これはLinuxシステムにあります。

答え1

tar引数に再帰しないように指示し、findそれを使用して各ディレクトリを引数として提供できます。したがって、次のようになります。

find . -type d -print0 | xargs -0 tar --no-recursion -cf your_tree.tar

名前にスペースやその他の特殊文字が含まれるディレクトリの問題を防ぐため-print0です。-0

以下の説明が示すように、ディレクトリが多いとコマンドラインが大きくなりすぎて何度もtar呼び出されます。この場合、以下を使用してパラメータを読み取ることができます--files-from

find . -type d -print0 | tar --null --no-recursion --files-from - -cf your_tree.tar

編集する:

上記は、OPが最上位ディレクトリにtarファイルセットが必要であることを明確にする前に作成されました。上記の技術を使用してこれを達成できると思います。たとえば、

$ mkdir -vp tree/a/b/c tree/foo/bar/baz                                                                                 
mkdir: created directory ‘tree’
mkdir: created directory ‘tree/a’
mkdir: created directory ‘tree/a/b’
mkdir: created directory ‘tree/a/b/c’
mkdir: created directory ‘tree/foo’
mkdir: created directory ‘tree/foo/bar’
mkdir: created directory ‘tree/foo/bar/baz’
$ touch tree/foo/an_unwanted_file
$ cd tree
/var/tmp/tree
$ for dir in $(find . -maxdepth 1 -type d); do if [ "$dir" != "." ]; then find "$dir" -type d -print0 | tar --null --no-recursion --files-from - -cvf "${dir}.tar"; fi; done
./a/
./a/b/
./a/b/c/
./foo/
./foo/bar/
./foo/bar/baz/
$ tar tvf foo.tar                                                                                                       
drwxr-xr-x andy/andy         0 2018-11-29 12:30 ./foo/
drwxr-xr-x andy/andy         0 2018-11-29 12:30 ./foo/bar/
drwxr-xr-x andy/andy         0 2018-11-29 12:30 ./foo/bar/baz/
$ tree
.
├── a
│   └── b
│       └── c
├── a.tar
├── foo
│   ├── an_unwanted_file
│   └── bar
│       └── baz
└── foo.tar

答え2

for dir in A/B/C/*/; do
    name=$(basename "$dir")
    tar -cv -f "$name.tar" -C A/B/C "$name"
done

これにより、下に各個別(非表示)サブディレクトリのアーカイブが作成されますA/B/C。アーカイブは現在のディレクトリに作成されます。

この-Cオプションは、tar次のファイル($name)の作業ディレクトリを設定します。

-C "$(dirname "$dir")"代わりに、-C A/B/C少し一般的なコードを使用できます。


Cサブディレクトリにアーカイブを作成する

( cd A/B/C &&
  for dir in */; do
      tar -cv -f "${dir%/}.tar" "$dir"
  done )

コマンド全体の周囲のサブシェルは、シェル/スクリプトの残りの部分で作業ディレクトリが変更されるのを防ぎ、値の${dir%/}末尾にあるスラッシュを削除します$dir

残念ながら、この-Cオプションは指定されたアーカイブファイルの作業ディレクトリには影響しません。それ以外の場合は、オプションの前のビットだけを-f移動できます。-C-f

または最初のループの変形として:

for dir in A/B/C/*/; do
    name=$( basename "$dir" )
    ( cd "$( dirname "$dir" )" && tar -cv -f "$name.tar" "$name" )
done

答え3

以下を使用することをお勧めします(私は最も古い無料のtar実装の作成者ですstar)。star

star cf file.tar -find . -type d

これは - をstar使用するため、tarファイルのすべての名前に対して機能します。libfind

関連情報