すべての「ドットファイル」を含むが、すべてのサブディレクトリと/ woディレクトリ構造を除くtarを使用してアーカイブを作成する


18

.zshrcホームディレクトリの下にあるすべての「ドットファイル」(fe )をtarでバックアップしたいのですが、ディレクトリ構造とすべてのサブディレクトリは除外します。

さまざまなコマンドで何度か試してみましたが、私が達成した最高の方法は、$HOME同様に隠しディレクトリを含むアーカイブでした。

#!/bin/zsh
BACKUPFILE=dotfile_backup.tar.gz
tar --create --file=$HOME/$BACKUPFILE --auto-compress --no-recursion --exclude=. --exclude=.. --exclude=*/ --directory=$HOME .*

またfind、結果を使用してtarにパイピングすることも考えましたが、運がありません。誰かがこれを達成する方法を知っていますか?

PS:ほとんどの場合、tarを使用してアーカイブを作成するとき、xkcdコミックについて考える必要があります。

xkcd 1168 :)


simの答えは機能しますが、隠しファイルのみに一致する正規表現を受け取った場合は投稿してください!
klingt.net

1
確かにこれはあなたのシェルでより良く達成されるでしょう。私はzshのファイルのみを選択グロブを持って理解して- *(.)-と私はそれを除外考える...から.*、デフォルトでは(そして彼らはによってピックアップされない.*(.)、それはファイルのみを選択するので、とにかく)。私は自分でzshを使用していないので、これを答えに変えるのに十分ではありません。
evilsoup

回答:


14

このコマンドを使用.<something>して、$HOMEディレクトリ内のすべてのドットファイル()をバックアップできます。

$ cd ~
$ find . -maxdepth 1 -type f -name ".*" -exec tar zcvf dotfiles.tar.gz {} +

正規表現だけを使用してタール?

方法#1

私はこれをかなり調査し、空っぽになりました。制限要因tarは、除外を実行するときに/、ディレクトリで表示される末尾のスラッシュ()がtarがパターンマッチを実行するときの方程式の一部ではないことです。

以下に例を示します。

$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*/'} .*
.qalculate/
.qt/
.qterm/
.qtoctave/
.RapidSVN
.RData
.Rhistory

このバリアントにはexcludeが含ま.*/れており-v、これらのディレクトリがそのexcludeを通過していることを示す詳細なスイッチをtarでオンにするとわかります。

方法#2

私は多分、スイッチを思った--no-wildcards-match-slash--wildcards-match-slashの貪欲を緩和でしょう.*/が、これはどちらかの効果がなかったです。

excludeからスラッシュを削除しても、すべてのdotfilesとdotdirectoriesを除外.*するように指示さtarれるため、オプションではありませんでした。

$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*'} .*
$

メソッド#3(Uい!)

だから、私が想像できる他の唯一の選択肢は、ファイルのリストをに提供することtarです。このようなもの:

$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --wildcards-match-slash --exclude={'.','..','.*/'} $(ls -aF | grep -E "^\..*[^/]$")
.RapidSVN
.RData
.Rhistory

ファイルの数がコマンドに引数を渡すための最大容量を超える場合、このアプローチには問題があります。もう1つは、itくて過度に複雑なことです。

それで、私たちは何を学びましたか?

tar正規表現を使用してこれを達成するための簡単でエレガントな方法はないようです。@terdonのコメントに関してfind ... | tar ...は、これが実際により適切な方法です。


私は本当にregexそれを
やり遂げ

@ klingt.net-それは可能であるはずです、私は今探しています。
slm

@ klingt.netなぜもっと複雑な方法を好むのですか?使用してregex、あなたはおそらく、先頭にドットをエスケープする必要がありますし、トラブル無視しなければならない.とします..。slmはおそらくデモンストレーションするので、それは可能だと確信していますが、なぜ価値があるのか​​わかりません。
テルドン

1
@ klingt.net- findコマンドが見つけたすべてのものがに引数として渡されますtar{}あなたはそれらの結果は、対応して行きたい場所と言う-execコマンド。+多くの結果として追加すると言うfindコマンドラインと呼び出しに収まるようtarにのみ数回ではなく、結果が発見されるたびに。
slm

1
@ klingt.net-これを使用regexしてこれを実現する方法はありません。tarドットディレクトリを分離する方法がないためです(.blah/)。Tarは、除外を行うときに末尾のスラッシュを使用しません。
slm

4

一致するファイルに対するこの種の制御は、tarの快適ゾーンの外側にあります。ファイルの一致に関する規則は、名前に対する単純な一致に制限されています。

find 1つの方法ですが、zshを使用しているため、簡単です。

tar -cf "$HOME/$BACKUPFILE" --auto-compress .*(.)

ことは、.ワイルドカード式の最後に括弧内にあるグロブ修飾子「のみ通常のファイルと一致する」と言います。

通常のファイルへのシンボリックリンクは一致しません。に変更すると.*(-.)、それらは含まれますが、ファイルも含まれない限り、ファイルはアーカイブに保存されません。シンボリックリンクをターゲットで置き換える場合は、それを行います.*(-.:A)—  シンボリックリンクを使用しないパスへのすべてのシンボリックリンクを解決する履歴展開修飾子:A追加します。


3

この回答はslmに基づいていますが、次で始まるディレクトリを含める方法も示します。 .

ホームディレクトリでドットファイルを圧縮するには:

$ cd
$ find . -maxdepth 1 -type f -name ".?*" -exec tar czfv dotfiles.tgz {} +

ディレクトリを含めるには:

$ find . -maxdepth 1 -name ".?*" -exec tar czfv dotfiles.tgz {} +

?最初のコマンドではなく、第二に任意であり、そうでなければ、find含まれる.(現在の)ディレクトリ。


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