アーカイブ対象から特定のファイル/フォルダーを除外することをサポートする簡単なシェルコマンド/スクリプトはありますか?
私がバックアップする必要がない非常に大きなファイルがいくつかあるサブディレクトリと一緒にアーカイブする必要があるディレクトリがあります。
完全ではない解決策:
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 .
Tarには複数の除外オプションを設定できます。
$ tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .
などが動作します。 --exclude
beforeをソースアイテムとターゲットアイテムにするためにsureを作ります。
Tarに--exclude
を付けてディレクトリを除外することができます。
/usr
以外のものをすべてアーカイブしたい場合は、次のようにします。
tar -zcvf /all.tgz / --exclude=/usr
あなたの場合はおそらく次のようになります。
tar -zcvf archive.tgz arc_dir --exclude=dir/ignore_this_dir
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
多くの答えがある古い質問ですが、私はどれも私にとって十分にはっきりしていないことがわかったので、私は私の試みを加えたいと思います。
次のような場合
/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にアクセスします)。
標準の "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
私は少なくとも 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、
この除外パターンは、pngやmp3のようなファイル名の接尾辞と、.gitやnode_modulesのようなディレクトリ名を処理します。
tar --exclude={*.png,*.mp3,*.wav,.git,node_modules} -Jcf ${target_tarball} ${source_dirname}
私は他のどこかで見つけたので私は信用しないでください、しかしそれは私のMac特有の問題のために上記のどの解決策よりもうまく機能しました(これが閉じられているとしても)
tar zc --exclude __MACOSX --exclude .DS_Store -f <archive> <source(s)>
Mac OSXのために私がしなければならなかった
tar -zcv --exclude='folder' -f theOutputTarFile.tar folderToTar
-f
の後の--exclude=
に注意してください
問題がある人のために、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 *
何万ものファイルを処理するときに'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 -
私は--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'
のように必ずパス全体を指定してください。
Tar追加(-r)オプションと組み合わせてfindコマンドを使用してください。この方法では、2段階の解決策(ファイルのリストの作成、tarの作成)の代わりに、単一のステップで既存のtarにファイルを追加できます。
find /dir/dir -Prune ... -o etc etc.... -exec tar rvf ~/tarfile.tar {} \;
このスレッドを読んだ後、私は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/*'
必要に応じて "--exclude-tag"オプションを使うこともできます。
指定されたファイルをホストしているフォルダは除外されます。
gnu tar v 1.26 --excludeはアーカイブファイルとバックアップディレクトリの引数の後に置く必要があります。先頭または末尾にスラッシュを付けず、引用符(一重または二重)を使用しないでください。バックアップするPARENTディレクトリからの相対パスは、次のとおりです。
tar cvfz /path_to/mytar.tgz ./dir_to_backup --exclude=some_path/to_exclude
Tarファイルを作成するにはcpio(1)を使用できます。 cpioはファイルを標準入力にアーカイブするので、アーカイブのファイルを選択するために使用するfindコマンドがすでにわかっている場合は、それをcpioにパイプ処理してtarファイルを作成します。
find ... | cpio -o -H ustar | gzip -c > archive.tar.gz
さまざまなバージョンのこの良い答えをすべて読んで問題を自分で解決した後、私は非常に重要で、GNU/Linuxの一般的な使用にはまれな非常に小さな詳細があると思います。十分であり、コメント以上のものです。
だから、私はすべての場合に質問に答えようとするつもりはないが、代わりに、物事がうまくいかないときにwhere to lookを登録しようとする。
IT IS通知に非常に重要:
私の場合、DebianストレッチのGNU tar 1.29の場合、機能するコマンドは
tar --exclude="/home/user/.config/chromium" --exclude="/home/user/.cache" -cf file.tar /dir1/ /home/ /dir3/
引用符は重要ではなく、引用符の有無にかかわらず機能しました。
これが誰かに役立つことを願っています。
tar -cvzf destination_folder source_folder -X /home/folder/excludes.txt
-Xは、バックアップから除外する必要があるファイル名のリストを含むファイルを示します。インスタンスの場合、バックアップに〜で終わるファイル名を含めないように、このファイルに*〜を指定できます。
あなたの最善の策は、xargsを介してtarでfindを使用することです(多数の引数を処理するため)。例えば:
find / -print0 | xargs -0 tar cjf tarfile.tar.bz2
見てみな
tar cvpzf Zip_folder.tgz . --exclude=./public --exclude=./tmp --exclude=./log --exclude=fileName
数ギガバイトの深さで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 を助けてくれました。 )
余計な答えの可能性がありますが、私はそれが便利だと思ったので、ここにあります。
FreeBSDのルート(つまりcshを使って)している間、ルートファイルシステム全体を/ mntにコピーしたいと思いましたが、/ usrと(明らかに)/ mntは使わなかった。これはうまくいったことです(私は/にいます):
tar --exclude ./usr --exclude ./mnt --create --file - . (cd /mnt && tar xvd -)
私の大事な点は、( ./ を置くことによって)除外するディレクトリをコピーするために除外ディレクトリをtarするために指定に必要であるということです。
私の€0.02