すべてのサブディレクトリで特定のファイルタイプをtarする方法は?


83

ディレクトリとそのサブディレクトリにあるtarとすべての.phpファイルと.htmlファイルが必要です。使用する場合

tar -cf my_archive *

それは私が望まないすべてのファイルをタールします。使用する場合

tar -cf my_archive *.php *.html

サブディレクトリは無視されます。再帰的にtarを作成し、2種類のファイルのみを含めるにはどうすればよいですか?

回答:


143

find ./someDir -name "*.php" -o -name "*.html" | tar -cf my_archive -T -


@DeeDeeファイル数などに制限はありますか?
user1566515 2013

1
@ DeeDee-いいえ、私が意味したのは、あなたが親を必要としないということでした!
Mike Makuch 2013

@ user1566515tarファイルに上限を設定するファイルシステム制限または全体的なスペース制限がある場合があります。それは完全にあなた自身のシステムに依存します。それ以外の場合、パイピングは基本的にその場でtarファイルを作成するため、ファイルの数やサイズに制約されることはありません。
DeeDee 2013

ありがとう!... 2つ以上の条件/ファイルの種類を追加する方法は?
gluuke 2014

5
-o -name [pattern]新しい条件ごとに@gluukeを使用
DeeDee

15

bashバージョン4.0を超えるものを使用している場合は、次のことを悪用shopt -s globstarして簡単に作業することができます。

shopt -s globstar; tar -czvf deploy.tar.gz **/Alice*.yml **/Bob*.json

これにより、任意のサブディレクトリからAliceで始まるすべての.ymlファイルが追加され、任意のサブディレクトリからBobで始まるすべての.jsonファイルが追加されます。


2
tarを使用する唯一の答え、ベストアンサーIMO。
simon 2017年

2
ディレクトリに対するglob '**'の印象にもかかわらず、このコマンドは再帰的に実行されません(サブサブフォルダー)
Eddie

@ Eddie **は機能するはずです。パラメータに何か違いがあるかもしれません。また、コマンドラインで渡したフォルダ名にスペースがあるかどうかを確認してください。そうでない場合は、実際のコマンドを貼り付けることができますか?
サイラムクリッシュ2018年

'**'は、コマンドに到達する前にシェルによって評価され、0または文字に解決される2つの独立した*としてのみ認識さ
Eddie

2
@eddieはい、シェルによって評価されますが、bash> 4.0にはshopt -s globstarオプションがあるため、答えは正しく、実際には最良のものです
Roman Usherenko 2018

13

1つの方法は次のとおりです。

tar -cf my_archive.tar $( find -name "*.php" -or -name "*.html" )

ただし、この方法にはいくつかの注意点があります。

  1. スペースを含むファイルまたはディレクトリがある場合は失敗し、
  2. コマンドラインの最大長がいっぱいになるほど多くのファイルがある場合は失敗します。

これらの回避策は、findコマンドの内容をファイルに出力してから、「-T、-files-fromFILE」オプションをtarに使用することです。


1)「失敗」とは、スペースのあるファイルがスキップされるか、tarアーカイブが作成されないことを意味しますか?2)約100Kのファイルがあります。コマンドラインの最大長を超えていますか?
user1566515 2013

1
1.アーカイブを作成しますが、不足しているファイルを報告します。2.それは長すぎると思います。これを考えると、@ DeeDeeが以下に提案するような方法を使用するのが最善であり、これらの問題を非常にうまく回避します。
ロビンシート2013


0

それらをファイルに入れます

find . \( -name "*.php" -o -name "*.html" \) -print > files.txt

次に、ファイルをtarへの入力として使用し、使用するtarのバージョンに応じて-Iまたは-Tを使用します

シンボリックリンクをコピーするにはhを使用します

tar cfh my.tar -I files.txt 

0

find ./ -type f -name "*.php" -o -name "*.html" -printf '%P\n' |xargs tar -I 'pigz -9' -cf target.tgz

マルチコアまたは1コアのみの場合:

find ./ -type f -name "*.php" -o -name "*.html" -printf '%P\n' |xargs tar -czf target.tgz


-2
tar -cf my_archive `find ./ | grep '.php\|.html'`

「find」と「grep」を使用して、すべてのディレクトリとそのサブディレクトリにある.phpファイルと.htmlファイルのすべてのパスを取得します。次に、それらのパス情報をtarに渡して圧縮します。

これらの記号 `と 'には注意してください。他のいくつかの回答とは異なり、これはコマンドラインでシェルが許可する文字数の制限に達することにも注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.