tarファイルのみがあり、ディレクトリはありません。

tarファイルのみがあり、ディレクトリはありません。

ファイルを見つけて、リストをtarに渡すシェルスクリプトを作成することもできますが、単一のコマンドラインでこれを実行できるtarに既に組み込まれている機能があるかどうか疑問に思います。

たとえば、スイッチが見つかりましたが、これを行うと--no-recursion次のようになります。

tar --no-recursion -cvf mydir.tar mydir

ディレクトリ(サブディレクトリを含む!)のエントリ名のみをアーカイブし、ファイルはアーカイブしません。

私も次のことを試しました。

 tar --no-recursion -cvf mydir.tar mydir/*

ただし、ファイルだけをアーカイブすると同時にアーカイブもします。名前サブディレクトリ。

ディレクトリ以外のファイルのみをtarに通知する方法はありますか?

答え1

findwithを使用したい場合のtar最良の方法はcpionotを使用することですtarcpio標準入力からアーカイブするファイルのリストを取得することを目的としたtarアーカイブを作成できます。

find mydir -maxdepth 1 -type f -print0 | cpio -o -H ustar -0 > mydir.tar

findを使用すると、ファイルを選択してアーカイブするために必要なすべての機能を活用できるため、cpioUnixスタイルのアプローチが少なくなります。この簡単な使い方を学ぶと、試してみると直面する問題を簡単に解決できることがわかります。findcpiocpiotar

答え2

camhが指摘したように、前のコマンドはファイル名が多すぎると何度も実行され、その後の呼び出しは以前の実行を自動的に消去するという小さな問題があります。また、圧縮しないため、上書きする代わりに追加できます。

find mydir -maxdepth 1 -type f -print0 | xargs -0 tar Avf mydir.tar
find mydir -maxdepth 1 -type f -exec tar Avf mydir.tar {} +

ヨークナズの答えおよびtarオプションを使用することも可能です。すでにインストールされている場合は、--null-Tcpioカムの答え使用するのも良いです。持っていてzshコマンドとして使っても大丈夫なら、ザイルズの答え zsh glob( *(.)) を使用するのが最も簡単なようです。


コアは-maxdepth選択です。最終回答、スペースを適切に処理する方法:

find mydir -maxdepth 1 -type f -print0 | xargs -0 tar cvf mydir.tar

これはまた働きます:

find mydir -maxdepth 1 -type f -exec tar cvf mydir.tar {} +

答え3

あなたはそれをまったく使用せずに使用することができますfind ... -print0tar ... --nullxargs

find . -maxdepth 1 -type f -print0 | tar cvf mydir.tar --null -T -

与えられた例では、ファイルパス(ディレクトリではない)だけからに渡されるため、--no-recursionオプションは必要ありません。tarfindtar

ただし、次の例のオプションを使用すると、ディレクトリの二重--no-recursionアーカイブが防止されます。代わりに、ディレクトリツリーの再帰が実行されます。tartarfindtar

# compare
find . -print0 | tar cf mydir.tar --null -T -
tar -tf mydir.tar | nl

find . -print0 | tar cf mydir.tar --null --no-recursion -T -
tar -tf mydir.tar | nl

答え4

何を求めているのか分からない。mydirサブディレクトリの代わりに通常のファイルを保存したい場合は、最も簡単な方法はzshを使用することです。通常のファイルのみを一致させるには、次を使用します。. グローバル予選:

tar cf mydir.tar mydir/*(.)

関連情報