web-dev-qa-db-ja.com

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 from この他のスーパーユーザーの質問 。ただし、サブディレクトリはコピーされません。また試してみましたcp -r A/.* B、ただし.そのため、Aの正確なコピー(通常のファイルを含む)で終わります。どんな助けでもありがたいです。

10
gaboroncancio

たとえば、Aレベルの隠しファイルとフォルダーのみを探していて、不要な場合

A/b/.hidden

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

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

これは基本的に、.で始まるものをコピーし、次に.以外の文字をコピーすることを意味します。これにより、...が除外されます

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

16
Omnipresence

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

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

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

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

4
choroba

このような場合は、次のように find の代わりに cp を使用することをお勧めします。

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

基本的な構文は次のように分類されます。

  • find A/ -type ffindディレクトリ内のアイテムA/タイプはファイル(ディレクトリではなく)です…
  • -maxdepth 1 -name '.*':これに対して、1つのディレクトリのmaxdepthに対して、name.で始まる。
  • -exec cp -p {} B/ \;:これらのファイルが見つかったら、execcpコマンドに-pフラグを付けて、ソースからの日付/時刻を保持します({}B/の目的地へ。

maxdepthを使用して制御のレイヤーを追加するのが好きなので、ファイルシステム全体を誤ってコピーしません。しかし、それを自由に削除してください。

3
JakeGould
 for item in `find A -type d | grep -E "\."` ; do cp -r $item B ; done
  • find A -type dは、A内にディレクトリのみの再帰リストを提供します
  • grep -E "\."ドットでディレクトリをフィルタリングします(つまり:非表示ディレクトリ)
  • -Eオプションが必要だったのは、それがないと "現在のディレクトリ"も意味するからです。
  • バックスラッシュは、正規表現では「任意の文字」の意味を回避するためのものです
  • cp -r再帰的にコピーする

私はAのファイルとフォルダーの構造を作成し、Git Bashでコマンドを実行しました(今はLinuxを使用していません)。

0
malarres

別の方法として、2番目の文字が英数字( source )の場合は、次のコマンドを使用できます。

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