隠しファイルを再帰的にコピーする-Linux


19

ディレクトリ内のすべての隠しファイルを別のディレクトリに再帰的にコピーする簡単な方法はありますか?通常のファイルではなく、すべての設定ファイルをホームディレクトリにバックアップしたいと思います。私は試した:

cp -R .* directory

しかし、すべての隠されていないファイルも認識...、再帰的にコピーします。cpに.and を無視させる方法はあり..ますか?


との間に違いは-rあり-Rますか?
チャミンダバンダラ

回答:


15

一般にダースを移動するのが私のお気に入りは:

tar cvf - . | (cd /dest/dir; tar xvf -)

現在のディレクトリをstdoutにtarし、stdinをuntarする前に宛先ディレクトリに最初にcdするサブシェルにパイプします。シンプル、直接、拡張可能-()を別のマシンのsshに置き換えるとどうなるかを検討してください。またはあなたの質問に答えるためにあなたがするかもしれません:

tar cvf - .* --exclude=\. --exclude=\.\. | (cd /dest/dir; tar xvf -)

1
おかげで、除外オプションは私が必要なものです。すでに別の方法で行っていますが、今後の参考のためにこれを保持します。これは非常に柔軟に見えます(ただし、より遅いかもしれません)。
ジフレ

1
いいアドバイス。改善点がいくつかあります:1)を使用しcd /dest/dir && tar xvf -ます。&&あなたが先にタイプミスがある場合は、ソースディレクトリ上blattingからあなたを停止します。2)vtarコマンドの1つでのみtar フラグが必要です(またはどちらでもありません)。
トム・ショー

けっこうだ。また、別の方法でグループ化することも知られています。リモートsrcdirをここにコピーするには、(cd /src/dir && tar cf - .) | tar xvf -
pjz

17

これはほぼすべての場合に解決できます:

cp -R .[a-zA-Z0-9]* directory

これらの文字のいずれかで始まらない隠しファイルがあることはかなり珍しいことです。

他のパターンマッチも利用可能(.??*.[^.]*)-コメントを参照


これは.-xyzのみを無視します-[]の中のものはドットの後の最初の文字にのみ一致します。
ハミッシュダウナー

6
。[^。] *すべてをキャッチするだろう
falstro

1
... 2つのピリオドで始まるものを除きます。
ファルストロ09年

@roe -あまりにも素敵なバージョンです
オリオン座ゼータ星

@mish-はい、私は答えでそう言った。
アルニタック

11

使用できますrsync

rsync -a ./ /some/other/directory/

現在のディレクトリの内容をコピーします(ドットファイルを含むが、含まない..


シンプルで、隠しフォルダー内の隠しファイルでも機能します。
user59183

私にとってこれはあまり混乱し、提供ソリューションの最も効果的である
palerdot

いい解決策。また、.gitディレクトリ間でコピーしないようにする必要がありました。-Cを追加するとこれが行われるため、コマンドは次のようになりますrsync -aC ./ /some/other/directory/
。– theruss

10

私は歩上のプレーンなシェル拡張から、あなたを懇願するcpシェル拡張は、あらゆる種類の持っている-コマンドラインエヘン「おもしろい」コーナーケースによって引き起こされる(不要な再帰をして..スペース、非印刷可能なもの、ハードリンク、シンボリックリンク、と。など)。find代わりに使用します(findutilsインストールしていない場合にパッケージに付属しています-奇妙なことに、すべてのディストリビューションがデフォルトでインストールします):

find -H /path/to/toplevel/dir/ -maxdepth 1 -name '.*' -a \( -type d -o -type f -o -type l \) -exec cp -a '{}' /path/to/destination/dir/ \;

ステップごとの説明:

  • -H原因となるfindシンボリックリンクに従うことではない(あなたがそれを与えた実際のトップレベルのディレクトリ名がシンボリックリンクがある場合を除いて、それが続くこと)
  • /path/to/toplevel/dir/ 明らかに、バックアップしたい設定ファイルとディレクトリをホストするディレクトリのパスであなたに置き換えられることになっています。
  • -maxdepth 1find名前がドットで始まるディレクトリへの再帰的な下降を停止します。再帰する必要はありません。cpそうするために、このレベルの名前が必要です。
  • -name '.*'伝えfind我々は、ドットで始まるすべての名前を望んでいること。環境変数POSIXLY_CORRECTが設定されている場合、これは正しく動作しませんが、まれにしか動作しません。これは、これまでに指定した最初の一致条件です。
  • a \( ....... \)カッコ内のより複雑な条件に続いて(私が使用した.....それを置き換えるために、それのは、以下に説明する。)彼らはそうでない場合は、シェルによって解釈(MIS)になるだろうので、私たちは、括弧をエスケープする必要があり、したがって、それらの前のバックスラッシュ、
  • -type d -o -type f -o -type l3つの条件であるか、それらの間で。-type dディレクトリに-type f一致し、通常のファイルに-type l一致し、シンボリックリンクに一致します。必要なものを選択することができます-たとえば、設定ディレクトリをバックアップしたくない場合は、省略します-type d(そして、その-oすぐ後ろは明らかに)。
  • -exec ..... \;伝えfindコマンドに一致が検出されるたびに実行します。コマンドの終わりはセミコロンでマークされていますが、これもシェルの解釈を避けるためにバックスラッシュでエスケープする必要があります。そのコマンドライン内{}で、現在検出されている一致の名前を最終的に使用する場所を使用する必要があります。シェルも中括弧を誤って解釈する可能性があるため、のようにアポストロフィで囲む必要があります'{}'。この場合に実行するコマンドはcp -a '{}' /path/to/destination/dir/次のとおりです(-サブディレクトリで再帰し、シンボリックリンクをリンクとしてコピーし、権限と拡張属性を保持し、/path/to/destination/dir/明らかに宛先ディレクトリの名前であるアーカイブを置き換えます-を意味します)。

したがって、わかりやすい英語では、このfindコマンドラインは次のように言います。

/ path / to / toplevel / dir /から開始します。サブディレクトリに降りないでください。名前がドットで始まるすべてのディレクトリ、ファイル、およびシンボリックリンクを検索します。見つかったものごとに、性質、許可、および拡張属性を保持しながら、/ path / to / destination / dir /にコピーします。


1
findはこれまでで最も便利なものです。
シャイニー氏と

1
いい答えだ。私は-exec ... ';'を好むが バックスラッシュを避けることは、このコマンドがCLIとcrontabの両方で機能することを意味します:))
kubanczyk 09年

8

私はいつも「。」を取得せずに隠しファイルを見つけるために。?? *を使用してきました。および「..」。ただし、「。a」または何かを見逃す可能性がありますが、私はそれらのいずれかを決して持っていません。


間違いなく素晴らしく、きちんとした:) +1
ファルストロ09年

私はいくつかの「.A」Sがある場合、それは神秘的に失敗したくない
Zifre

単一文字の隠しファイルがないことがわかっている場合は、入力するのが非常に速いため、気に入っています。
ポールトムブリン

これが最良の答えでなければなりません。トップに投票する必要があります。
イブンサイード

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