隠しファイルと隠しディレクトリとその内容を含めるためにcpでコピーする方法は?


392

ディレクトリ内のすべてのファイルとディレクトリを完全にcp -rコピーするにはどうすればよいですか

要件:

  • 隠しファイルと隠しディレクトリを含めます。
  • 上記を含めるためのフラグ付きの単一のコマンドである。
  • パターンマッチングにまったく依存する必要はありません。

私のいが、働いているハックは:

cp -r /etc/skel/* /home/user
cp -r /etc/skel/.[^.]* /home/user

これをすべてパターンマッチングなしで1つのコマンドで実行するにはどうすればよいですか?どのフラグを使用する必要がありますか?


1
ここではより多くの回答がありますが、見た目は良くありません。serverfault.com/questions/3154/...
ロエル・ファン・デ・パール

Eleven81、新しいフォルダーの作成を回避するため、受け入れられた回答を@bruno pereiraの回答に変更することを検討してください。そうでない場合は、このコメントを新しい読者への警告にして、他の(最も投票された)回答も確認します。Tx。
ベコ博士

回答:


265

ファイルを指定しないでください:

cp -r /etc/skel /home/user

/home/userまだ存在してはならないことに注意してください。存在しない場合、作成されます/home/user/skel。)


61
場合にも、同様のものを使用することが可能である/home/user/skel ない存在?
bradley.ayers

@ bradley.ayers一時的なサブディレクトリにコピーしてから、それらを上位レベルに移動できると思います(同じドライブでの移動が速いため)。理想的とは言えませんが、他のソリューションよりも短いです。
ハリルÖzgür13年

7
@ bradley.ayers以下のブルーノの答えはあなたの質問に対応します
マーク

1
このソリューションは私にはうまくいきませんでした。隠しファイルはコピーしませんでした。CentOSリリース6.5を使用しています。@Brunoのソリューションがそのトリックを実現しました。
Technext

2
ubuntu / debianの下では、これはディレクトリ 'skel'をskel内の再帰ファイルではなくターゲットディレクトリ内に配置します。使用する-T適切な使用のために(ターゲットなし)以下のあたりを。(-rT再帰的)
bshe

468

新しいフォルダーを作成した(または作成しようとしている)とし、フォルダーの作成後にファイルをコピーしたい

mkdir /home/<new_user>
cp -r /etc/skel/. /home/<new_user>

これにより、すべてのファイル/フォルダー/etc/skelが、最初の行で作成された既存のフォルダーに再帰的にコピーされます。


5
間違っていなかった場合、これは隠し/ドットファイルをコピーしませんでした。
ハリルÖzgür13年

34
私にとってはうまくいきます。「。」それが機能するために重要です。
マーク

12
動作しますが、なぜですか?マニュアルにこれへの参照が見つかりません。
ジュリアンパラード

5
通常、これは最初の引数の最後のフォルダーの名前で新しいフォルダーを作成するため、動作すると思います。ただし、その名前は.なので、この動作では既存のディレクトリを作成する必要があるため、そのステップはスキップされます。
ゼネクサー14年

28
@Technext bashのデフォルトのグロビングには、で始まるファイル名は含まれません。これらのファイルを含める前にコマンド.を使用する必要があることを変更しshopt -s dotglobます。その*ため、デフォルトでは、このディレクトリからすべてのファイルを再帰的にコピーするように求められます*(デフォルトでは隠しファイルは含まれません)。一方、.あなたはcpを使用して、「このディレクトリ」からすべてを再帰的にコピーしています。
ブルーノペレイラ

79

これを行う正しい方法は、-T (--no-target-directory)オプションを使用し、フォルダーを再帰的にコピーすることです(末尾のスラッシュ、アスタリスクなどを使用せずに)、つまり:

cp -rT /etc/skel /home/user

これにより/etc/skel/home/user(隠しファイルを含む)の内容がコピーされ、フォルダー/home/userが存在しない場合は作成されます。ただし、この-Tオプションは、フォルダーが存在する場合、コンテンツが/etc/skel新しいフォルダーにコピーされ/home/user/skelないようにします/home/user


3
正解。+1
bshea

これは確かに正確に正しい答えだった
ガエタン

これが束のベストアンサーです。それを複雑にすることなく問題を解決し、その一つだけ
ZaxLofful

期待どおりにコピーするように正確に動作します
チェタバハナ

1つのケースに正しいcmdフラグを使用するときに、それが大好きです。
Tran Triet

66

bashそれ自体に良い解決策があり、それはshell option、あなたができるcpなどですmv

shopt -s dotglob # for considering dot files (turn on dot files)

そして

shopt -u dotglob # for don't considering dot files (turn off dot files)

上記のソリューションは bash

注意:

shopt # without argument show status of all shell options
-u # abbrivation of unset 
-s # abbrivation of set

2
これは、宛先内に新しいディレクトリを作成せずにコンテンツのみをコピーする場合に便利です。特に、宛先ディレクトリがマウントポイントの場合。
kaszynek

3
これは本当に最高の答えであると、質問の核心になる...
スティーブン

7
setopt他の誰かが疑問に思っている場合のために、zsh のためです。
パット

25

rsyncを使用します。

rsync -rtv source_folder/ destination_folder/


--progressを使用して、プロセス全体についてより多くのフィードバックを得ることができますが、私にとって最適なオプションです。
エデンショー

5

rsync 良いですが、別の選択肢:

cp -a src/ dst/

メインヘルプから:

   -a, --archive
          same as -dR --preserve=all

   -d     same as --no-dereference --preserve=links

   -R, -r, --recursive
          copy directories recursively

常にcp -rを使用しました。cp -aに言及していただきありがとうございます
ピナキムカージー

4

ソースディレクトリとターゲットディレクトリの名前が同じ場合、ターゲットディレクトリが存在する場合でも、次のように入力できます。

cp -R /etc/skel /home/

これにより、隠しファイルとディレクトリを含む/ etc / skelディレクトリが/ home /にコピーされます。

最終的に、ディレクトリをコピーして、1行で名前を変更できます。

cp -R /etc/skel /home/ && mv /home/skel /home/user

それとも、単に使用できるcp -r /etc/skel /home/user名前変更のためskeluser...
デヴィッド・

/ home / userがまだ存在しない場合のみです。
ガブリエルHautclocq

4

rsyncを使用できます。

rsync -aP ./from/dir/ /some/other/directory/

sshでコピーすることもできます

rsync -aP ./from/dir/ username@remotehost:/some/other/directory/

使用できるさまざまなフラグがあります:-a、-archive#archive(-rlptgoD)

-r, --recursive
-l, --links      # copy symlinks as links
-p, --perms      # preserve permissions
-t, --times      # preserve times
-g, --group      # preserve group
-o, --owner      # preserve owner
-D               # --devices --specials

--delete         # Delete extra files

You may want to add the -P option to your command.

--partial        # By default, rsync will delete any partially transferred file if the transfer is interrupted. In some circumstances it is more desirable to keep partially transferred files. Using the --partial option tells rsync to keep the partial file which should make a subsequent transfer of the rest of the file much faster.

-P               # The -P option is equivalent to --partial --progress.   Its  purpose  is to make it much easier to specify these two options for a long transfer that may be interrupted.

Rsync manページ


4

最も簡単な方法は次のとおりです。

cp -r /etc/skel/{.,}* /home/user

式に{.,}*は、すべてのファイルとディレクトリが含まれます(ドットで始まる)。

上記の式を使用したくない場合cpは、1つのターゲットフォルダーに複数のソースを指定する機能であるプロパティを使用できます。

cp -r /etc/skel/* /etc/skel/.* /home/user

1
これは..anything...anythingなどのファイルを見逃します。- stackoverflow.com/a/31438355/2351568には、この問題の正しい正規表現が含まれています。|| とにかく、使用することshopt -s dotglobは依然として優れたソリューションです!
DJCrashdummy

@DJCrashdummy残念ながら、なぜあなたがあなたの注意を書いたのかわかりません。結局のところ、私のソリューションでは、あなたが書いているケースを考慮しています。よろしく
-simhumileco

間違ったテキストをごめんなさい!-あなたの答えの問題は、それはまた、検討すること、である...(現在およびその含まれているフォルダに相当します)。|| ただし、リンク回答でさらに説明し、解決策を提供しています。
DJCrashdummy

2

コマンドライントリック(で働く、少なくとも、そこにあることに注意してくださいshをbashの、およびkshは):ちょうどサフィックスからスラッシュでディレクトリを。これにより、fromディレクトリの内容がtoディレクトリに注がれます(皮肉なことに、私は最初にrsync を使用する ときにこのトリックについて学びました)。

例:

/tmp$ mkdir test_dir1
/tmp$ cd test_dir1/
/tmp/test_dir1$ touch aa
/tmp/test_dir1$ touch .bb
/tmp/test_dir1$ cd ..
/tmp$ mkdir test_dir2

/tmp$ cp -r test_dir1/* test_dir2
/tmp$ ls -1a test_dir2
.
..
aa

/tmp$ cp -r test_dir1/ test_dir2
/tmp$ ls -1a test_dir2
.
..
.bb
aa

2

同じ問題の解決策をGoogleで探してここに来たのですが、見つけるのは簡単だとわかりました。シェルやインストールされていない可能性のある特別なユーティリティに依存しないという利点。

find /etc/skel/ -mindepth 1 -exec cp -r {} /home/username/ \;

末尾のスラッシュでトリックを試しましたが、それはうまくいきませんでした。


2

すべてのファイル.ファイルを含む)をアクセス許可を保持するターゲットディレクトリにコピーする必要がある場合のこの問題の解決策は次のとおりです(既に存在する場合は上書きします)。

yes | cp -rvp /source/directory /destination/directory/

yes宛先ファイルを自動的に上書きするため、 r再帰的、 v冗長、 pアクセス許可を保持します。

ソースパスの末尾がaではない/ことに注意してください(すべてのファイル/ディレクトリと。ファイルがコピーされます)。

宛先ディレクトリ/は、ソースフォルダーの内容を全体として宛先に配置しているため、終了します。


1

cpは常に隠しファイルをコピーするとは限らないので、すべてのlinux / unixダイアレクトで機能するコマンドが必要な場合は、以下を使用してみてください。

cd /etc/skel
find | cpio -pdumv /home/user

-2

少なくともK3b 2.0.3の時点では、ディレクトリがプロジェクトに追加されたときにポップアップする質問ボックスがあり、隠しファイルを含めるかどうかを尋ねます...ポップアップする質問もありますリンク。いい従業員!


「ポップアップする質問ボックス」—シェル(CLI)コマンドの場合?
スコット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.