.zshrc
私のホームディレクトリにあるすべての「ドットファイル」(fe)をバックアップしたいと思います。アスファルトただし、ディレクトリ構造とすべてのサブディレクトリは含まれません。
私は別のコマンドで何度も試しましたが、私が達成した最高のものは、隠されたディレクトリを含む$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漫画を考慮する必要があります。
:)
答え1
次のコマンドを使用して、ディレクトリ内のすべてのドットファイル(.<something>
)をバックアップできます$HOME
。
$ cd ~
$ find . -maxdepth 1 -type f -name ".*" -exec tar zcvf dotfiles.tar.gz {} +
tarだけを使う正規表現?
方法1
私はこれについてかなり多くの研究を行いましたが、何も見つかりませんでした。制限要因は、tar
除外を実行するときに/
ディレクトリに表示される末尾のスラッシュ()が、tarがパターンマッチングを実行するときの方程式の一部ではないことです。
例は次のとおりです。
$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*/'} .*
.qalculate/
.qt/
.qterm/
.qtoctave/
.RapidSVN
.RData
.Rhistory
このバリエーションには、tarの詳細スイッチをオンにしてこれらのディレクトリが通過するのを見ることができる除外.*/
機能が含まれています。-v
方法#2
スイッチが人々の貪欲を解放してくれる--no-wildcards-match-slash
かもしれないと思っていましたが、それも効果がありませんでした。--wildcards-match-slash
.*/
除外項目からスラッシュを削除することも.*
オプションではありません。tar
これは、すべてのドットファイルとドットディレクトリを除外するように指示するためです。
$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*'} .*
$
方法#3(醜い!)
だから私が考えることができる唯一の他のオプションは次のとおりですtar
。
$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --wildcards-match-slash --exclude={'.','..','.*/'} $(ls -aF | grep -E "^\..*[^/]$")
.RapidSVN
.RData
.Rhistory
このアプローチの問題は、ファイル数がコマンドに引数を渡すための最大スペースを超えると顕著に現れます。もう一つは醜くて複雑すぎるということです。
それで私たちは何を学びましたか?
&正規表現を使ってこれを行う簡単でエレガントな方法はないようですtar
。 @terdonのコメントによると、find ... | tar ...
これは実際にはより適切なアプローチです。
答え2
一致するファイルのこの種の制御は、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 {} +
最初のコマンドでは?
オプションですが、2 番目のコマンドではオプションではありません。それ以外の場合は(現在)ディレクトリがfind
含まれます。.
答え4
何について:
tar -C $HOME -cvzf dotfiles.tgz .