ディレクトリ内のすべての隠しファイルを別のディレクトリに再帰的にコピーする簡単な方法はありますか?通常のファイルではなく、ホームディレクトリ内のすべての設定ファイルのみをバックアップしたいと思います。私は試した:
cp -R .* directory
ただし、.
および..
を認識し、非表示ではないファイルもすべて再帰的にコピーします。 cpに.
および..
を無視させる方法はありますか?
一般的に、dirsを移動するのが私のお気に入りです。
tar cvf - . | (cd /dest/dir; tar xvf -)
現在のディレクトリをstdoutにtarで圧縮し、それをサブシェルにパイプして、stdinをuntarする前に、最初にcdして宛先ディレクトリに移動します。シンプル、直接、拡張可能-()を別のマシンのsshに置き換えるとどうなるかを検討します。または、あなたの質問に答えるために:
tar cvf - .* --exclude=\. --exclude=\.\. | (cd /dest/dir; tar xvf -)
ほとんどの場合、これは次の方法で解決できます。
cp -R .[a-zA-Z0-9]* directory
これらの文字のいずれかで始まらない隠しファイルがあるのはかなり珍しいことです。
他のパターンマッチが利用可能です(.??*
、.[^.]*
)-コメントを参照してください
rsync
を使用できます。
rsync -a ./ /some/other/directory/
現在のディレクトリの内容をコピーします(ドットファイルを含みますが、..
は含みません)
申し訳ありませんが、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 /にコピーし、性質、権限、および拡張属性を保持します。
私は常に。?? *を使用して、「。」を取得せずに隠しファイルを検索しました。そして「..」。 ".a"か何かを見逃すかもしれませんが、私はそれらの1つを持っていることはありません。
たとえば、ネイティブbashソリューションにshoptを使用することについて説明します