ファイルを見つけて、リストをtarに渡すシェルスクリプトを作成することもできますが、単一のコマンドラインでこれを実行できるtarに既に組み込まれている機能があるかどうか疑問に思います。
たとえば、スイッチが見つかりましたが、これを行うと--no-recursion
次のようになります。
tar --no-recursion -cvf mydir.tar mydir
ディレクトリ(サブディレクトリを含む!)のエントリ名のみをアーカイブし、ファイルはアーカイブしません。
私も次のことを試しました。
tar --no-recursion -cvf mydir.tar mydir/*
ただし、ファイルだけをアーカイブすると同時にアーカイブもします。名前サブディレクトリ。
ディレクトリ以外のファイルのみをtarに通知する方法はありますか?
答え1
find
withを使用したい場合のtar
最良の方法はcpio
notを使用することですtar
。cpio
標準入力からアーカイブするファイルのリストを取得することを目的としたtarアーカイブを作成できます。
find mydir -maxdepth 1 -type f -print0 | cpio -o -H ustar -0 > mydir.tar
find
を使用すると、ファイルを選択してアーカイブするために必要なすべての機能を活用できるため、cpio
Unixスタイルのアプローチが少なくなります。この簡単な使い方を学ぶと、試してみると直面する問題を簡単に解決できることがわかります。find
cpio
cpio
tar
答え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
-T
cpio
カムの答え使用するのも良いです。持っていて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 ... -print0
。tar ... --null
xargs
find . -maxdepth 1 -type f -print0 | tar cvf mydir.tar --null -T -
与えられた例では、ファイルパス(ディレクトリではない)だけからに渡されるため、--no-recursion
オプションは必要ありません。tar
find
tar
ただし、次の例のオプションを使用すると、ディレクトリの二重--no-recursion
アーカイブが防止されます。代わりに、ディレクトリツリーの再帰が実行されます。tar
tar
find
tar
# 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/*(.)