970

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

バックアップする必要のない非常に大きなファイルが多数あるサブディレクトリでアーカイブする必要があるディレクトリがあります。

完全な解決策ではありません:

コマンドは指定されたパターンに一致し、tar --exclude=PATTERNそれらのファイルを除外しますが、特定のファイルとフォルダーを無視する必要があります (完全なファイル パス)。そうしないと、有効なファイルが除外される可能性があります。

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

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

より良い/より効率的なソリューションを考えられる人はいますか?

編集: Charles Maのソリューションはうまく機能します。大きな落とし穴は、tar コマンドの先頭にある--exclude='./folder' 必要があることです。完全なコマンド (最初に cd を実行するため、バックアップはそのディレクトリに相対的です):

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

28 に答える 28

1256

tar には複数の除外オプションを設定できるので、

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

などが動作します。ソース項目と宛先項目のに置くようにしてください。--exclude

于 2009-06-11T23:11:19.027 に答える
144

--excludefor tarでディレクトリを除外できます。

/usr使用できるものを除いてすべてをアーカイブしたい場合:

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

あなたの場合、おそらく次のようなものです

tar -zcvf archive.tgz arc_dir --exclude=dir/ignore_this_dir
于 2009-06-11T23:08:46.550 に答える
81

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
于 2012-11-08T00:22:34.477 に答える
13

私はこれを別の場所で見つけたので、信用はしませんが、Mac 固有の問題に対して上記のどのソリューションよりもうまく機能しました (これはクローズされていますが)。

tar zc --exclude __MACOSX --exclude .DS_Store -f <archive> <source(s)>
于 2010-02-05T21:59:16.747 に答える
8

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

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

すぐには明らかではなかった副作用に対する警告の言葉: この例で「fileA」を除外すると、「fileA」が再帰的に検索されます!

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

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

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

于 2016-07-15T15:56:04.333 に答える
6

このスレッドを読んだ後、RHEL 5 で少しテストを行いました。abc ディレクトリを tar した結果は次のとおりです。

これにより、ディレクトリのエラーとログ、およびディレクトリの下のすべてのファイルが除外されます。

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

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

tar cvpzf abc.tgz abc/ --exclude='abc/error/*' --exclude='abc/logs/*'
于 2014-05-09T21:26:36.640 に答える
5

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

# 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 -
于 2012-03-04T15:18:30.647 に答える
3

cpio(1) を使用して tar ファイルを作成できます。cpio は stdin にアーカイブするファイルを取得するため、アーカイブするファイルを選択するために使用する find コマンドを既に把握している場合は、それを cpio にパイプして tar ファイルを作成します。

find ... | cpio -o -H ustar | gzip -c > archive.tar.gz
于 2009-06-12T05:53:17.610 に答える
3

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

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

于 2014-04-14T16:21:50.937 に答える
3

find コマンドを tar 追加 (-r) オプションと組み合わせて使用​​します。この方法では、2 つのパス ソリューション (ファイルのリストを作成し、tar を作成する) ではなく、1 つのステップで既存の tar にファイルを追加できます。

find /dir/dir -prune ... -o etc etc.... -exec tar rvf ~/tarfile.tar {} \;
于 2009-06-11T23:03:57.467 に答える
1

見てみな

tar cvpzf zip_folder.tgz . --exclude=./public --exclude=./tmp --exclude=./log --exclude=fileName
于 2016-07-21T09:56:34.310 に答える
0

冗長な回答の可能性がありますが、便利だと思ったので、次のとおりです。

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

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

私の要点は、( ./を入れることによって)より大きなディレクトリの一部がコピーされる除外されたディレクトリを tarに指定する必要があったということです。

私の €0.02

于 2013-09-04T22:35:38.840 に答える
0

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

find / -print0 | xargs -0 tar cjf tarfile.tar.bz2
于 2009-06-11T23:04:12.677 に答える
0

ローカルホストに新しいフロントエンド バージョン (角度フォルダー) が必要です。また、私の場合、gitフォルダーは巨大であり、除外したいと考えています。アプリケーションを実行するには、サーバーからダウンロードして解凍する必要があります。

/var/lib/tomcat7/webapps から angular フォルダーを圧縮し、angular.23.12.19.tar.gz という名前の /tmp フォルダーに移動します。

指示 :

tar --exclude='.git' -zcvf /tmp/angular.23.12.19.tar.gz /var/lib/tomcat7/webapps/angular/
于 2019-12-23T09:42:24.693 に答える
-1

次の bash スクリプトでうまくいくはずです。ここでは、マーカス サンドマンによって提供された回答を使用します。

#!/bin/bash

echo -n "Please enter the name of the tar file you wish to create with out extension "
read nam

echo -n "Please enter the path to the directories to tar "
read pathin

echo tar -czvf $nam.tar.gz
excludes=`find $pathin -iname "*.CC" -exec echo "--exclude \'{}\'" \;|xargs`
echo $pathin

echo tar -czvf $nam.tar.gz $excludes $pathin

これにより、必要なコマンドが出力され、コピーして貼り付けることができます。おそらく、コマンド ラインに直接指定するもっと洗練された方法があります。

除外したい他の一般的な拡張子、ファイル名、または正規表現の *.CC を変更するだけで、これは引き続き機能するはずです。

編集

少し説明を追加します。find は、選択した正規表現 (この場合は *.CC) に一致するファイルのリストを生成します。このリストは、xargs を介して echo コマンドに渡されます。これは --exclude 'リストから 1 つのエントリ' を出力します。スラッシュ () は、' マークのエスケープ文字です。

于 2016-10-28T14:01:35.053 に答える