.*ディレクトリを含めるためにtarを使用する正しい構文

.*ディレクトリを含めるためにtarを使用する正しい構文

*/*/.thisdirectory/*tarアーカイブに一致するファイルを含めようとしています。正しい構文は何ですか?明らかにこれはそうではありません:

> find .
.
./bar
./bar/.a
./bar/.a/baz
./foo
./foo/.a
> tar --include "*[.]a*" -cvf a.tar .
>

答え1

私はあなたがFreeBSD tar1を使用していると仮定します。それは私が知っている唯一の--include実装なので、オプションがあるからです。

これを渡すと、--include明示的に埋め込まれたファイルのみが検索されます。アーカイブを構築するときにディレクトリを巡回しないと、ディレクトリやその内容を含めることはできません。圧縮.が含まれていないため、.一意のコマンドライン引数は含まれず、空のアーカイブが得られます。

.aディレクトリにアクセスするには、すべての親ディレクトリを含める必要があります。問題は、これはその内容もすべて含まれることです。を使用して除外できますが、--exclude含めるポイント ディレクトリを除外しない除外パターンが必要です。現時点では--include役に立ちません。この--includeオプションは、アーカイブの作成にはあまり役に立ちません。既存のアーカイブの一部をコピーする場合に便利です。

tar --exclude='./*/[!.]*' -cvf a.tar .

最上位ディレクトリのすべてのファイルが含まれます。空でないコンテンツがあるディレクトリだけを含める方法はないと思います。

./*/.*ディレクトリだけをインポートして他のもの(特に親ディレクトリを除く)を取得するには、tarが再帰的にディレクトリを見つけることを許可するのではなく、tarに引数として渡す必要があります。

tar -cvf a.tar ./*/.[!.]*/

ディレクトリ(またはディレクトリへのシンボリックリンク)ではないファイルを含めるには、末尾のスラッシュを削除します。./*/..?*/含まれる名前で始まるディレクトリが..ある場合は追加します。

¹他のオペレーティングシステムで発生する可能性があります。

答え2

シェルがbashの場合は、この変数を使用してディレクトリを非GLOBIGNORE表示にできます。また、非表示のファイルと非表示のファイルが一致するようにオプションが自動的に設定されます。...dotglob*

GLOBIGNORE=".:.."
tar czf tarball-with-hidden-files.tgz directory/*

少し拡張するには:デフォルトで*隠しファイル(で始まるファイル)は一致しません。これには、現在の()ディレクトリと.すべてのディレクトリの.親()ディレクトリが含まれます。..glob(たとえば、コマンドラインワイルドカード)を一致させるには、対応するオプションを設定する必要がありますが、dotglobこれにより、次のような結果が発生する可能性があります。本物..一致するものがあり、*そのような操作を実行すると、何か悪いことが起こります(一致rm -fr /home/olduser/*によって、誰もがホームディレクトリが飛び出しました。これが始まる場所です。ワイルドカードと一致するコンテンツをブラックリストに追加します。非常に簡単なユースケース:olduser/../home/GLOBIGNORE

ghoti@home:~/scratch$ ls -ld ?dotfile
ls: cannot access '?dotfile': No such file or directory
ghoti@home:~/scratch$ touch _dotfile .dotfile
ghoti@home:~/scratch$ ls -ld ?dotfile
-rw-rw-r-- 1 ghoti ghoti 0 May  6 16:58 _dotfile
ghoti@home:~/scratch$ GLOBIGNORE=".:.."
ghoti@home:~/scratch$ ls -ld ?dotfile
-rw-rw-r-- 1 ghoti ghoti 0 May  6 16:58 _dotfile
-rw-rw-r-- 1 ghoti ghoti 0 May  6 16:58 .dotfile

これはあなたにとって何を意味しますか?さて、この回答の上部のクイック例に示すように、一度無視するように設定し、GLOBIGNOREそれ.を使用してアーカイブしたいディレクトリなどの隠しディレクトリを一致させる..ことができます。*

tar czf mytarball.tgz directory/*  # this will include things like directory/.hiddenfile

次のディレクトリを指す具体的な例.a

ghoti@home:~/scratch$ mkdir -p example example/foo/.a example/bar/.a example/foo/_a example/bar/_a
ghoti@home:~/scratch$ touch example/{foo,bar}/{.,_}a/file
ghoti@home:~/scratch$ find example/
example/
example/foo
example/foo/_a
example/foo/_a/file
example/foo/.a
example/foo/.a/file
example/bar
example/bar/_a
example/bar/_a/file
example/bar/.a
example/bar/.a/file
ghoti@home:~/scratch$ GLOBIGNORE=".:.."
ghoti@home:~/scratch$ tar cvzf withdotfiles.tgz example/*/?a
example/bar/_a/
example/bar/_a/file
example/bar/.a/
example/bar/.a/file
example/foo/_a/
example/foo/_a/file
example/foo/.a/
example/foo/.a/file
ghoti@home:~/scratch$ unset GLOBIGNORE
ghoti@home:~/scratch$ tar cvzf withoutdotfiles.tgz example/*/?a
example/bar/_a/
example/bar/_a/file
example/foo/_a/
example/foo/_a/file

答え3

しかし、ここでは古い言葉に乗るよりもtarを使ってこれを行う必要があるという明白な「予想」方法の証拠を指摘する人を見つけることができないので、次のようになります。

他の場所で指摘したように、問題はtarが文字通り「--include」を受け入れ、--includeが最初にファイルをフィルタリングすると、.aファイルを見つけるためにfooとbarディレクトリを巡回しないことです。

tar /is/ 使い方の手がかりはマニュアルページに含まれていますが、かなり混乱しています。 --includeは既存のアーカイブをフィルタリングするために使用されるものとして「仮定」され、tarを読み取るための魔法パラメータ@-もあります。 from STDIN 取得したデータは、既存のアーカイブから読み取ったデータとして扱われます。

要約すると、混乱したtarステートメントを使用して、現在のディレクトリにあるすべてのアイテムのアーカイブを作成してSTDOUTに埋め込むことができます。次に、--includeオプションを使用してtarにパイプします。そしてSTDINから読みます。

あなたの場合は次のとおりです。

tar-cf-/ | tar -cf myfiles.tar --include="。 ㅏ"@-

Soyokaze:test$ ls -lR
total 32
drwxr-xr-x   6 tyler  staff   204 Nov 29 14:24 bar/
drwxr-xr-x   4 tyler  staff   136 Nov 29 14:23 foo/

./bar:
total 0
-rw-r--r--  1 tyler  staff    0 Nov 29 14:23 baa.a
-rw-r--r--  1 tyler  staff    0 Nov 29 14:23 baaa.a
-rw-r--r--  1 tyler  staff    0 Nov 29 14:23 baz
drwxr-xr-x  2 tyler  staff   68 Nov 29 14:24 boos/

./bar/boos:
total 0

./foo:
total 0
-rw-r--r--  1 tyler  staff    0 Nov 29 14:23 baa.a
-rw-r--r--  1 tyler  staff    0 Nov 29 14:23 baz.a

Soyokaze:test$ tar -cf - */ | tar -cf myfiles.tar --include="*.a" @-

Soyokaze:test$ tar -tf myfiles.tar
bar/baa.a
bar/baaa.a
foo/baa.a
foo/baz.a

関連情報