Findコマンドはこの出力を提供します:
[root @ localhost /]#find var/log/-iname anaconda。* var/log/anaconda.log var/log/anaconda.xlog var/log/anaconda.yum.log var/log/anaconda.syslog var/log/anaconda.program.log var/log/anaconda.storage.log
Tarと組み合わせると、次の出力が表示されます。
[root @ localhost /]#find var/log/-iname anaconda。* -exec tar -cvf file.tar {} \; var/log/anaconda.log var/log/anaconda.xlog var/log/anaconda.yum.log var/log/anaconda.syslog var/log/anaconda.program.log var/log/anaconda.storage.log
しかし、tarファイルを一覧表示すると、単一のファイルのみが表示されます
[root @ localhost /]#tar -tvf file.tar -rw ------- root/root 208454 2012-02-27 12:01 var/log/anaconda。 storage.log
ここで何が間違っているのですか?
Xargsを使用すると、次の出力が得られます。
[root @ localhost /]#find var/log/-iname anaconda。* | xargs tar -cvf file1.tar
Varの前に/と入力すると、find /var/log
がこのメッセージを表示する理由tar:先頭の削除メンバー名からの `/ '
[root @ localhost /]#find/var/log/-iname anaconda。* -exec tar -cvf file.tar {} \; tar:メンバー名から先頭の「/」を削除 /var/log/anaconda.log tar:メンバー名から先頭の「/」を削除します /var/log/anaconda.xlog tar:先頭を削除しますメンバー名からの `/' /var/log/anaconda.yum.log tar:メンバー名からの先頭の`/'の削除 /var/log/anaconda.syslog tar:メンバー名から先頭の「/」を削除します /var/log/anaconda.program.log tar:メンバー名から先頭の「/」を削除します /var/log/anaconda.storage.log
単純な形で、次の2つの違いは何ですか?
find var/log
およびfind /var/log
あなたは次のようなものを使うことができます:
find var/log -iname 'anaconda.*' -print0 | tar -cvf somefile.tar --null -T -
-print0
および-T
連携して、スペース改行などのファイル名を許可します。最後の-
は、入力ファイル名をstdinから読み取るようにtarに指示します。
ご了承ください -print0
この答え に従って、ステートメントの最後に来る必要があります。そうしないと、おそらく予想よりも多くのファイルが取得されます。
これを試して:
_tar -cvf file.tar `find var/log/ -iname "anaconda.*"`
_
find
を_-exec tar
_に使用しようとしました。しかし、_-exec
_オプションが機能する方法では、一致するファイルが見つかるたびにそのコマンドが1回実行され、tar
が毎回生成するtarファイルを上書きします。あなたが最後のものだけで終わったのはそのためです。また、シェルがfind
に渡す前に展開しないように、find
に指定するパターンを引用符で囲む必要があります。
バッククォートを使用したコマンド置換(または、必要に応じて$(...)
表記を使用)を使用すると、find
によって生成された名前のリスト全体が、tar
の引数としてコマンドラインに貼り付けられます。 、それらを一度にすべて書き込みます。
tar
は見つかった各ファイルを取得してfile.tar
にアーカイブしているため、コマンドは失敗します。そのたびに、以前に作成されたfile.tar
を上書きします。
すべてのファイルを含む1つのアーカイブが必要な場合は、tar
を直接実行するだけです。find
は必要ありません(名前にスペースが含まれているファイルでも機能します)。
tar -vcf file.tar /var/log/anaconda*
2つのコマンドは完全に異なります。
find var/logはvar/log
というディレクトリを検索しますこれは現在のディレクトリのサブディレクトリです、これはfind ./var/log
と同等です(./
に注意してください)。
find/var/logは、/var/log
ルートのサブディレクトリである/
というディレクトリを検索します。
先頭の/
メッセージはtar
ではなくfind
からのものです。これは、ファイル名の最初の/
を削除して絶対パスを相対にすることを意味します。つまり、アーカイブを解凍すると、/var/log/anaconda.error
のファイルが./var/log/anaconda.error
に抽出されます。
2つの方法があります-exec
働ける。 1つの方法でコマンドを何度も実行します-ファイルごとに1回。もう1つの方法では、すべてのファイルをパラメーターのリストとして含めて、コマンドを1回実行します。
-exec tar -cvf file.tar {} ';'
は、各ファイルに対してtar
コマンドを実行し、毎回アーカイブを上書きします。-exec tar -cvf file.tar {} '+'
はtar
コマンドを1回実行し、見つかったすべてのファイルのアーカイブを作成します。各ファイルに-execを使用すると、多くのファイルがある場合、tar圧縮が非常に遅くなる可能性があると思います。私は次のコマンドを使用することを好みます:
find . -iname "*.jpg" | cpio -ov -H tar -F jpgs.tar