フォルダー 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 A/ -type f -maxdepth 1 -name '.*' -exec cp -p {} B/ \;
基本的な構文は次のようになります。
find A/ -type f
:find
ディレクトリ内の、A/
タイプがファイルである項目 (ディレクトリではなく)...-maxdepth 1 -name '.*'
: これに、で始まるmaxdepth
1 つのディレクトリが含まれます。name
.
-exec cp -p {} B/ \;
: これらのファイルが見つかると、ソース ( ) から宛先 ( ) までの日付/時刻を保持するフラグ付きのコマンドがexec
実行されます。cp
-p
{}
B/
maxdepth
誤ってファイルシステム全体をコピーしないように、制御レイヤーを追加するためにを使用するのが好きです。ただし、これは削除してもかまいません。
答え4
代わりに、2番目の文字が英数字の場合は、この他のコマンドを使用できます(ソース):
cp -r A/.[a-zA-Z0-9]* B