web-dev-qa-db-ja.com

特定のファイル/フォルダを除くtarディレクトリへのシェルコマンド

アーカイブ対象から特定のファイル/フォルダーを除外することをサポートする簡単なシェルコマンド/スクリプトはありますか?

私がバックアップする必要がない非常に大きなファイルがいくつかあるサブディレクトリと一緒にアーカイブする必要があるディレクトリがあります。

完全ではない解決策:

tar --exclude=PATTERNコマンドは与えられたパターンにマッチしてそれらのファイルを除外しますが、無視するには特定のファイルとフォルダが必要です(フルファイルパス)。さもなければ有効なファイルが除外されるかもしれません。

Findコマンドを使用してファイルのリストを作成し、アーカイブしたくないファイルを除外してそのリストをtarに渡すこともできますが、これは少量のファイルに対してのみ有効です。私は何万人もいます。

唯一の解決策は、除外するファイル/フォルダのリストを含むファイルを作成し、次に--exclude-from=fileを付けてrsyncを使用してすべてのファイルをtmpディレクトリにコピーし、次にtarを使用してそのディレクトリをアーカイブすることです。

誰かがより良い/より効率的な解決策を考えることができますか?

編集:cmaの解決策はうまくいきます。大きな問題は、--exclude='./folder'MUSTがtarコマンドの先頭にあることです。フルコマンド(最初にcd、バックアップはそのディレクトリからの相対パス):

cd /folder_to_backup
tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .
683
deepwell

Tarには複数の除外オプションを設定できます。

$ tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .

などが動作します。 --excludebeforeをソースアイテムとターゲットアイテムにするためにsureを作ります。

881
Charles Ma

Tarに--excludeを付けてディレクトリを除外することができます。

/usr以外のものをすべてアーカイブしたい場合は、次のようにします。

tar -zcvf /all.tgz / --exclude=/usr

あなたの場合はおそらく次のようになります。

tar -zcvf archive.tgz arc_dir --exclude=dir/ignore_this_dir
123
Johan Soderberg

Tarを使用してバックアップからファイル/ディレクトリを除外するための可能なオプション:

複数のパターンを使用してファイルを除外する

tar -czf backup.tar.gz --exclude=PATTERN1 --exclude=PATTERN2 ... /path/to/backup

パターンのリストで埋められた除外ファイルを使用してファイルを除外する

tar -czf backup.tar.gz -X /path/to/exclude.txt /path/to/backup

スキップする必要があるディレクトリにタグファイルを配置して、タグを使用しているファイルを除外します。

tar -czf backup.tar.gz --exclude-tag-all=exclude.tag /path/to/backup
53

多くの答えがある古い質問ですが、私はどれも私にとって十分にはっきりしていないことがわかったので、私は私の試みを加えたいと思います。

次のような場合

/home/ftp/mysite/

以下のファイル/フォルダを使って

/home/ftp/mysite/file1
/home/ftp/mysite/file2
/home/ftp/mysite/file3
/home/ftp/mysite/folder1
/home/ftp/mysite/folder2
/home/ftp/mysite/folder3

そのため、(サイトを新しいサーバーに移動するために)/ home/ftp/mysiteの中にすべてのものを含むtarファイルを作成したいのですが、file3は単にジャンクであり、folder3内のすべても必要ないので省略します。二。

フォーマットを使います

tar -czvf <name of tar file> <what to tar> <any excludes>

c = create、z = Zip、およびv = verbose(入力したファイルを確認できます。除外するファイルがどれも追加されていないことを確認するのに役立ちます)。そしてf =ファイル。

だから、私のコマンドはこのようになります

cd /home/ftp/
tar -czvf mysite.tar.gz mysite --exclude='file3' --exclude='folder3'

除外されたファイル/フォルダは、あなたのtarのルートに対する相対パスであることに注意してください(ここでは/に対してフルパスを試してみましたが、うまく機能させることはできません)。

これが誰かに役立つことを願っています(そして次回はGoogleにアクセスします)。

38
Sverre

標準の "ant記法"を使ってディレクトリを相対的に除外することができます。
これは私には有効で、.gitまたはnode_moduleディレクトリを除外します。

tar -cvf myFile.tar --exclude=**/.git/* --exclude=**/node_modules/*  -T /data/txt/myInputFile.txt 2> /data/txt/myTarLogFile.txt

myInputFile.txt含まれているもの:

/ dev2/Java
/dev2/javascript

17
Eric Manley

私は少なくとも Cygwin バージョンのtarを使っていることを経験しました。 Windows XP Home Edition SP3マシンでは、オプションの順序は重要です。

この構築は私のために働いたが:

tar cfvz target.tgz --exclude='<dir1>' --exclude='<dir2>' target_dir

その/ しなかった work:

tar cfvz --exclude='<dir1>' --exclude='<dir2>' target.tgz target_dir

これはtar --helpから明らかになりましたが、

tar [OPTION...] [FILE]

したがって、2番目のコマンドも機能するはずですが、どうやらそうではないようです...

最高のrgds、

16
GeertVc

この除外パターンは、pngやmp3のようなファイル名の接尾辞と、.gitやnode_modulesのようなディレクトリ名を処理します。

tar --exclude={*.png,*.mp3,*.wav,.git,node_modules} -Jcf ${target_tarball}  ${source_dirname}
12
Scott Stensland

私は他のどこかで見つけたので私は信用しないでください、しかしそれは私のMac特有の問題のために上記のどの解決策よりもうまく機能しました(これが閉じられているとしても)

tar zc --exclude __MACOSX --exclude .DS_Store -f <archive> <source(s)>
10
Rob

Mac OSXのために私がしなければならなかった

tar -zcv --exclude='folder' -f theOutputTarFile.tar folderToTar

-fの後の--exclude=に注意してください

7
Jerinaw

問題がある人のために、tarのバージョンによっては、除外値に './'が付いていないと正しく動作しないでしょう。

Tar --version

tar(GNU tar)1.27.1

機能するコマンド構文:

tar -czvf ../allfiles-butsome.tar.gz * --exclude=acme/foo

これらは機能しません。

$ tar -czvf ../allfiles-butsome.tar.gz * --exclude=./acme/foo
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude='./acme/foo'
$ tar --exclude=./acme/foo -czvf ../allfiles-butsome.tar.gz *
$ tar --exclude='./acme/foo' -czvf ../allfiles-butsome.tar.gz *
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude=/full/path/acme/foo
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude='/full/path/acme/foo'
$ tar --exclude=/full/path/acme/foo -czvf ../allfiles-butsome.tar.gz *
$ tar --exclude='/full/path/acme/foo' -czvf ../allfiles-butsome.tar.gz *
7
J. Lawson

何万ものファイルを処理するときに'xargs: Argument list too long'を使用することによって発生する可能性のあるfind ... | xargs ...エラーを回避するために、find ... -print0 | tar --null ...を使用してfindの出力を直接tarにパイプ処理することができます。

# archive a given directory, but exclude various files & directories 
# specified by their full file paths
find "$(pwd -P)" -type d \( -path '/path/to/dir1' -or -path '/path/to/dir2' \) -Prune \
   -or -not \( -path '/path/to/file1' -or -path '/path/to/file2' \) -print0 | 
   gnutar --null --no-recursion -czf archive.tar.gz --files-from -
   #bsdtar --null -n -czf archive.tar.gz -T -
5
carlo

私は--excludeフラグが正しいアプローチであることに同意します。

$ tar --exclude='./folder_or_file' --exclude='file_pattern' --exclude='fileA'

私がすぐに明らかにしなかった副作用のためのwarningの単語:この例での 'fileA'の除外は 'fileA' RECURSIVELY!を検索します

例:同じ名前のファイルを含む単一のサブディレクトリを持つディレクトリ(data.txt)

data.txt
config.txt
--+dirA
  |  data.txt
  |  config.docx
  • --exclude='data.txt'を使用する場合、アーカイブはどちらか data.txtファイルを含みません。 node_modulesディレクトリなどのサードパーティライブラリをアーカイブすると、これが予期しない結果を引き起こす可能性があります。

  • この問題を回避するには、--exclude='./dirA/data.txt'のように必ずパス全体を指定してください。

5
Aaron Votre

Tar追加(-r)オプションと組み合わせてfindコマンドを使用してください。この方法では、2段階の解決策(ファイルのリストの作成、tarの作成)の代わりに、単一のステップで既存のtarにファイルを追加できます。

find /dir/dir -Prune ... -o etc etc.... -exec tar rvf ~/tarfile.tar {} \;
4
Alex B

このスレッドを読んだ後、私はRHEL 5で少しテストをしました、そしてabcディレクトリをタールアップした結果がここにあります:

これはディレクトリエラーとログおよびディレクトリ下のすべてのファイルを除外します。

tar cvpzf abc.tgz abc/ --exclude='abc/error' --exclude='abc/logs'

除外ディレクトリの後にワイルドカードを追加すると、ファイルは除外されますがディレクトリは保持されます。

tar cvpzf abc.tgz abc/ --exclude='abc/error/*' --exclude='abc/logs/*'
4
Mike

必要に応じて "--exclude-tag"オプションを使うこともできます。

  • --exclude-tag = FILE
  • --exclude-tag-all = FILE
  • --exclude-tag-under = FILE

指定されたファイルをホストしているフォルダは除外されます。

3
frommelmak

gnu tar v 1.26 --excludeはアーカイブファイルとバックアップディレクトリの引数の後に置く必要があります。先頭または末尾にスラッシュを付けず、引用符(一重または二重)を使用しないでください。バックアップするPARENTディレクトリからの相対パスは、次のとおりです。

tar cvfz /path_to/mytar.tgz ./dir_to_backup --exclude=some_path/to_exclude

2
Andrew

Tarファイルを作成するにはcpio(1)を使用できます。 cpioはファイルを標準入力にアーカイブするので、アーカイブのファイルを選択するために使用するfindコマンドがすでにわかっている場合は、それをcpioにパイプ処理してtarファイルを作成します。

find ... | cpio -o -H ustar | gzip -c > archive.tar.gz
2
camh

さまざまなバージョンのこの良い答えをすべて読んで問題を自分で解決した後、私は非常に重要で、GNU/Linuxの一般的な使用にはまれな非常に小さな詳細があると思います。十分であり、コメント以上のものです。

だから、私はすべての場合に質問に答えようとするつもりはないが、代わりに、物事がうまくいかないときにwhere to lookを登録しようとする。

IT IS通知に非常に重要:

  1. オプション項目の順序:バックアップするファイルオプションとディレクトリの前よりも前に--excludeを置くことは同じではありません。私の経験では、GNU/Linuxコマンドでは、通常、オプションの順序は重要ではないため、これは少なくとも私にとっては予想外です。
  2. 異なるtarバージョンはこのオプションを異なる順序で期待します:たとえば、 @ Andrewの答え は、GNU tar v 1.26および1.28で除外が最後に来ることを示します。一方、私の場合、GNU tar 1.29を使用すると、逆になります。
  3. トレーリングスラッシュマテリアル:少なくともGNU tar 1.29では、それはないはずです

私の場合、DebianストレッチのGNU tar 1.29の場合、機能するコマンドは

tar --exclude="/home/user/.config/chromium" --exclude="/home/user/.cache" -cf file.tar  /dir1/ /home/ /dir3/

引用符は重要ではなく、引用符の有無にかかわらず機能しました。

これが誰かに役立つことを願っています。

2
user2553863
tar -cvzf destination_folder source_folder -X /home/folder/excludes.txt

-Xは、バックアップから除外する必要があるファイル名のリストを含むファイルを示します。インスタンスの場合、バックアップに〜で終わるファイル名を含めないように、このファイルに*〜を指定できます。

1
Ashwini Gupta

あなたの最善の策は、xargsを介してtarでfindを使用することです(多数の引数を処理するため)。例えば:

find / -print0 | xargs -0 tar cjf tarfile.tar.bz2
1
Joe

見てみな

tar cvpzf Zip_folder.tgz . --exclude=./public --exclude=./tmp --exclude=./log --exclude=fileName
0
RohitPorwal

数ギガバイトの深さで5ギガバイトのサブディレクトリを除外するようにtarを取得するのは運が悪かった。最後に、私はちょうどunix Zipコマンドを使いました。それは私にとってずっと楽に働きました。

オリジナルの投稿からのこの特定の例のために
(tar --exclude = '。/ folder' --exclude = '。/ upload/folder2' -zcvf /backup/filename.tgz)

同等なものは次のようになります。

Zip -r /backup/filename.Zip -x upload/folder/**\* upload/folder2/**\*

(注:これは私が最初に使用した投稿で、 https://superuser.com/questions/312301/unix-Zip-directory-but-excluded-specific-subdirectories-and-everything-within-t を助けてくれました。 )

0
user2792605

余計な答えの可能性がありますが、私はそれが便利だと思ったので、ここにあります。

FreeBSDのルート(つまりcshを使って)している間、ルートファイルシステム全体を/ mntにコピーしたいと思いましたが、/ usrと(明らかに)/ mntは使わなかった。これはうまくいったことです(私は/にいます):

tar --exclude ./usr --exclude ./mnt --create --file - . (cd /mnt && tar xvd -)

私の大事な点は、( ./ を置くことによって)除外するディレクトリをコピーするために除外ディレクトリをtarするために指定に必要であるということです。

私の€0.02

0
George