フォルダ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
from この他のスーパーユーザーの質問 。ただし、サブディレクトリはコピーされません。また試してみましたcp -r A/.* B
、ただし.
そのため、Aの正確なコピー(通常のファイルを含む)で終わります。どんな助けでもありがたいです。
たとえば、Aレベルの隠しファイルとフォルダーのみを探していて、不要な場合
A/b/.hidden
コピーするには、これを使用できるはずです:
cp -r A/.[^.]* B
これは基本的に、.
で始まるものをコピーし、次に.
以外の文字をコピーすることを意味します。これにより、.
と..
が除外されます
編集:Askerが所有権や日付などを保持したいことを示していないため、cpコマンドから-pを削除しました。
A/.*
の問題は、A
にディレクトリ.
があり、これもパターンと一致することです。
拡張グロブパターンをオンにして、以下を使用できます。
shopt -s extglob
cp -r A/.!(?(.)) B
名前がドットで始まり、2番目の文字がドットでも何でもないファイルに一致します(?(。)は何もまたはドットに一致しません。!(...)はそれを否定します。つまり、!(?(。))は他のすべてに一致します何もないか、ドットより)。
このような場合は、次のように find
の代わりに cp
を使用することをお勧めします。
find A/ -type f -maxdepth 1 -name '.*' -exec cp -p {} B/ \;
基本的な構文は次のように分類されます。
find A/ -type f
:find
ディレクトリ内のアイテムA/
タイプはファイル(ディレクトリではなく)です…-maxdepth 1 -name '.*'
:これに対して、1つのディレクトリのmaxdepth
に対して、name
が.
で始まる。-exec cp -p {} B/ \;
:これらのファイルが見つかったら、exec
cp
コマンドに-p
フラグを付けて、ソースからの日付/時刻を保持します({}
) B/
の目的地へ。maxdepth
を使用して制御のレイヤーを追加するのが好きなので、ファイルシステム全体を誤ってコピーしません。しかし、それを自由に削除してください。
for item in `find A -type d | grep -E "\."` ; do cp -r $item B ; done
find A -type d
は、A内にディレクトリのみの再帰リストを提供しますgrep -E "\."
ドットでディレクトリをフィルタリングします(つまり:非表示ディレクトリ)cp -r
再帰的にコピーする私はAのファイルとフォルダーの構造を作成し、Git Bashでコマンドを実行しました(今はLinuxを使用していません)。
別の方法として、2番目の文字が英数字( source )の場合は、次のコマンドを使用できます。
cp -r A/.[a-zA-Z0-9]* B