Linux で隠しファイル (ドットで始まる) とサブディレクトリをコピーするにはどうすればいいですか?

Linux で隠しファイル (ドットで始まる) とサブディレクトリをコピーするにはどうすればいいですか?

フォルダー A 内の隠しファイルと隠しサブディレクトリ (ドットで始まるもの) をフォルダー B にコピーするにはどうすればよいでしょうか? たとえば、次のような構造の場合:

A/a
A/b
A/.a
A/.b/
A/.b/somefile
A/.b/.c

A の隠しファイルと隠しサブディレクトリだけを B にコピーしたい:

B/.a
B/.b/
B/.b/somefile
B/.b/.c

cp A/.* B私はすでにこのコマンドを試しました:この他のスーパーユーザーの質問ただし、サブディレクトリはコピーされません。 も試しましたcp -r A/.* Bが、コピーされる.ため、A の正確なコピー (通常のファイルを含む) が作成されます。 ご協力いただければ幸いです。

答え1

Aレベルの隠しファイルやフォルダのみを検索し、例えば

A/b/.hidden

コピーするには、これを使用できるはずです:

cp -r A/.[^.]* B

基本的には、aで始まる.文字と、a以外の文字.をコピーすることを意味します...

編集: Asker が所有権や日付などを保持する意思を示していないため、cp コマンドから -p を削除しました。

答え2

問題は、パターンに一致するディレクトリA/.*が存在することです。.A

拡張 glob パターンをオンにして、以下を使用できます。

shopt -s extglob
cp -r A/.!(?(.)) B    

これは、名前がドットで始まり、2 番目の文字がドットでも何もないでもないファイルと一致します ( ?(.) は何もないかドットと一致し、 !(...) はそれを否定します。つまり、 !(?(.)) は何もないかドット以外のすべてと一致します)。

答え3

このような場合には、findの代わりにcpこのような:

find A/ -type f -maxdepth 1 -name '.*' -exec cp -p {} B/ \;

基本的な構文は次のようになります。

  • find A/ -type f:findディレクトリ内の、A/タイプがファイルである項目 (ディレクトリではなく)...
  • -maxdepth 1 -name '.*': これに、で始まるmaxdepth1 つのディレクトリが含まれます。name.
  • -exec cp -p {} B/ \;: これらのファイルが見つかると、ソース ( ) から宛先 ( ) までの日付/時刻を保持するフラグ付きのコマンドがexec実行されます。cp-p{}B/

maxdepth誤ってファイルシステム全体をコピーしないように、制御レイヤーを追加するためにを使用するのが好きです。ただし、これは削除してもかまいません。

答え4

代わりに、2番目の文字が英数字の場合は、この他のコマンドを使用できます(ソース):

cp -r A/.[a-zA-Z0-9]* B

関連情報