bashスクリプトには、以下を除いて正常に実行される(つまりファイル生成_data.tar
)非常に単純な行があります。いいえオプションから除外するサブディレクトリを除外します--exclude
。
/bin/tar -cf /home/_data.tar --exclude='/data/sub1/*' --exclude='/data/sub2/*' --exclude='/data/sub3/*' --exclude='/data/sub4/*' --exclude='/data/sub5/*' /data
_data.tar
代わりに、除外したいサブディレクトリのファイルを含む、/ dataの下のすべての内容を含むファイルを作成します。
理由をご存知ですか?この問題を解決するには?
修正する私は以下の最初の答えに与えられたリンクに基づいて観察を実装しました(最上位ディレクトリから、最後に除外した後に空白なし)。
/bin/tar -cf /home/_data.tar /data --exclude='/data/sub1/*' --exclude='/data/sub2/*' --exclude='/data/sub3/*' --exclude='/data/sub4/*' --exclude='/data/sub5/*'
しかし、これは役に立ちません。すべての「除外された」サブディレクトリが結果_data.tar
ファイルに表示されます。
これは謎です。これが現在tar(CentOS 6.2のGNU tar 1.23、Linux 2.6.32)のバグなのか、空白や他の簡単に見逃せるタイプミスに対するtarの「極度の感度」なのか、私はこれがバグだと思います。現在。
これは怖すぎる:以下に提案された洞察力を(後続せずに/*
)試しましたが、まだ本番スクリプトでは機能しません。
/bin/tar -cf /home/_data.tar /data --exclude='/data/sub1' --exclude='/data/sub2' --exclude='/data/sub3' --exclude='/data/sub4'
引用符と1の代わりに2つのスペースを除いて、私が試したものと@Richard Perrinが試したものとの間に何の違いも見られません。私はこれを試してみて(サポートするディレクトリが大きいので、夜間スクリプトが実行されるのを待つ必要があります)、もう一度報告します。
/bin/tar -cf /home/_data.tar /data --exclude=/data/sub1 --exclude=/data/sub2 --exclude=/data/sub3 --exclude=/data/sub4
私はすべてのtar --exclude
感度がタールではなく、私の環境にあるものだと思い始めました。しかし、それは何ですか?
効率的!試した最後のバリアント(シングルクォートなしとsの間にダブルスペースの代わりに単一のスペース--exclude
)が機能するかどうかをテストしました。変ですが受け入れ可能です。
信じられない!tar
以前のバージョン(1.15.1)では、最上位ディレクトリが次の場合にのみ機能することがわかりました。最後コマンドラインから。これはバージョン1.23で要求されるものとは正反対です。参考用。
答え1
そのバージョンでは、コマンドの先頭にオプションを配置する必要がtar
あるかもしれません。--exclude
tar
望むより:https://stackoverflow.com/q/984204
tar --exclude='./folder' --exclude='./upload/folder2' \
-zcvf /backup/filename.tgz .
望むより:http://mandrivausers.org/index.php?/topic/8585-multiple-exclude-in-tar/
tar --exclude=<first> --exclude=<second> -cjf backupfile.bz2 /home/*
選択する:
EXCLD='first second third'
tar -X <(for i in ${EXCLD}; do echo $i; done) -cjf backupfile.bz2 /home/*
別のtar
コマンドプロンプトは次のようになります。ここ:
tar cvfz myproject.tgz --exclude='path/dir_to_exclude1' \
--exclude='path/dir_to_exclude2' myproject
答え2
ディレクトリ全体を除外するには、パターンがディレクトリ内のファイルではなくそのディレクトリと一致する必要があります。--exclude=/data/sub1
代わりに使用--exclude='/data/sub1/*'
シェル拡張からパターンを保護するには、パターンを引用するときに注意してください。
電話の問題が発生する次の例をご覧ください。
$ for i in 0 1 2; do mkdir -p /tmp/data/sub$i; echo foo > /tmp/data/sub$i/foo; done
$ find /tmp/data
/tmp/data
/tmp/data/sub2
/tmp/data/sub2/foo
/tmp/data/sub0
/tmp/data/sub0/foo
/tmp/data/sub1
/tmp/data/sub1/foo
$ tar -zvcf /tmp/_data.tar /tmp/data --exclude='/tmp/data/sub[1-2]'
tar: Removing leading `/' from member names
/tmp/data/
/tmp/data/sub0/
/tmp/data/sub0/foo
$ tar -zvcf /tmp/_data.tar /tmp/data --exclude=/tmp/data/sub[1-2]
tar: Removing leading `/' from member names
/tmp/data/
/tmp/data/sub0/
/tmp/data/sub0/foo
$ echo tar -zvcf /tmp/_data.tar /tmp/data --exclude=/tmp/data/sub[1-2]
tar -zvcf /tmp/_data.tar /tmp/data --exclude=/tmp/data/sub[1-2]
$ tar -zvcf /tmp/_data.tar /tmp/data --exclude /tmp/data/sub[1-2]
tar: Removing leading `/' from member names
/tmp/data/
/tmp/data/sub2/
/tmp/data/sub2/foo
/tmp/data/sub0/
/tmp/data/sub0/foo
/tmp/data/sub2/
tar: Removing leading `/' from hard link targets
/tmp/data/sub2/foo
$ echo tar -zvcf /tmp/_data.tar /tmp/data --exclude /tmp/data/sub[1-2]
tar -zvcf /tmp/_data.tar /tmp/data --exclude /tmp/data/sub1 /tmp/data/sub2
答え3
複数のファイルを除外するには:
--exclude=/data/{sub1,sub2,sub3,sub4}
これにより、一部のコードが節約され、頭痛が軽減されます。これは、あらゆる種類のプログラム/オプションに適したグローバルソリューションです。選択に親ディレクトリ(この場合はデータ)も含めるには、後にカンマを含める必要があります。たとえば、
umount /data/{sub1,sub2,}
答え4
このリンクが役に立ちます。 http://answers.google.com/answers/threadview/id/739467.html
機能しない行とリンクのいくつかのヒントとの2つの即時の違いは次のとおりです。
- すべての除外が適用されます。後ろにトップレベルディレクトリ。
- 最後の項目の後にスペースを入れることはできません
--exclude
。