web-dev-qa-db-ja.com

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

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

cp -R .* directory

ただし、.および..を認識し、非表示ではないファイルもすべて再帰的にコピーします。 cpに.および..を無視させる方法はありますか?

19
Zifre

一般的に、dirsを移動するのが私のお気に入りです。

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

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

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

ほとんどの場合、これは次の方法で解決できます。

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

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

他のパターンマッチが利用可能です(.??*.[^.]*)-コメントを参照してください

19
Alnitak

rsyncを使用できます。

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

現在のディレクトリの内容をコピーします(ドットファイルを含みますが、..は含みません)

11
Rory

申し訳ありませんが、cpコマンドラインで単純なシェル展開から離れてください-シェル展開にはあらゆる種類のahem「興味深い」コーナーがありますケース(。と..、スペース、印刷できないもの、ハードリンク、シンボリックリンクなどが原因で発生する不要な再帰。)代わりに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 1_は、findが名前がドットで始まるディレクトリに再帰的に下降するのを停止します。再帰する必要はありません。cpがそれを行います。このレベルの名前が必要です。
  • _-name '.*'_は、ドットで始まるすべての名前が必要であることをfindに伝えます。これは、環境変数_POSIXLY_CORRECT_が設定されている場合は正しく機能しませんが、設定されていることはほとんどありません。これは、これまでに指定した最初の一致条件です。
  • a \( ....... \)andの後にかっこで囲まれたより複雑な条件が続きます(これを置き換えるために.....を使用しました。以下で説明します。)かっこをエスケープする必要があります。そうでなければ、それらはシェルによって(誤って)解釈されるため、それらの前のバックスラッシュは、
  • _-type d -o -type f -o -type l_は、間にorがある3つの条件です。 _-type d_はディレクトリに一致し、_-type f_は通常のファイルに一致し、_-type l_はシンボリックリンクに一致します。必要なものを選択できます。たとえば、設定ディレクトリをバックアップしたくない場合は、_-type d_(およびそのすぐ後ろにある_-o_は明らかに)省略します。
  • _-exec ..... \;_は、一致が検出されるたびにコマンドを実行するようにfindに指示します。コマンドの終わりはセミコロンでマークされています。これは、シェルの解釈を避けるために、バックスラッシュでエスケープする必要があります。そのコマンドラインでは、現在検出された一致の名前を最終的に取得する場所で_{}_を使用する必要があります。シェルは中括弧も誤って解釈する可能性があるため、_'{}'_のようにアポストロフィで囲む必要があります。この場合に実行するコマンドは_cp -a '{}' /path/to/destination/dir/_です(-aはアーカイブを意味します。これはサブディレクトリで再帰し、シンボリックリンクをリンクとしてコピーし、権限と拡張属性を保持します。_/path/to/destination/dir/_は明らかに宛先ディレクトリーの名前です-置き換えてください。)

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

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

10

私は常に。?? *を使用して、「。」を取得せずに隠しファイルを検索しました。そして「..」。 ".a"か何かを見逃すかもしれませんが、私はそれらの1つを持っていることはありません。

8
Paul Tomblin

ここではるかに良い答え; https://superuser.com/questions/61611/how-to-copy-with-cp-to-include-hidden-files-and-hidden-directories-and-their-con

たとえば、ネイティブbashソリューションにshoptを使用することについて説明します

0