web-dev-qa-db-ja.com

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

cp -rにディレクトリ内のファイルとディレクトリのコピー絶対すべてを作成する方法

必要条件

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

私の醜い、しかし働いている、ハックは:

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

パターンマッチングを使わずに、これを1つのコマンドですべて実行する方法を教えてください。どのフラグを使う必要がありますか?

363
eleven81

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

cp -r /etc/skel /home/user

/home/userは既に存在してはいけません、そうでなければ/home/user/skelを作成します。)

246
Randy Orrison

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

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

これは/etc/skelから最初の行に作成された既存のフォルダにすべてのファイル/フォルダを再帰的にコピーします。

452
Bruno Pereira

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

cp -rT /etc/skel /home/user

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

68
TechnocratiK

bash自体は良い解決策を持っています、それはShell optionを持っています、あなたはcpmvなどをすることができます。

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
65
PersianGulf

Rsyncを使う:

rsync -rtv source_folder/ destination_folder/

24
user1084282

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

cp -R /etc/skel /home/

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

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

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

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
4
Wink Saville

あなたは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ページ

3
RoshP

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

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

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

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

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

コマンドラインのトリックがあることに注意してください(少なくともshbash、およびksh)で動作します)。単にfromディレクトリの後ろにスラッシュを付けます。 fromディレクトリの内容をtoディレクトリに)入れます(皮肉なことに、singrsync)を使ったときにこのトリックについて最初に学びました。

例:

/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
Dustin Oprea

私はここでGoogledに同じ問題の解決策を求めて来ました、それから私はそれがfindでするのが簡単であることに気づきました。利点は、シェル、またはインストールされていない可能性がある特別なユーティリティには依存しません。

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

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

2
Linus

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

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

yesは自動的に宛先ファイルを上書きするためのもので、r recursive、v verbose、pはパーミッションを保持します。

ソースパスが/で終わっていないことに注意してください(したがって、すべてのfiles/directoryと。filesがコピーされます)。

ソースフォルダの内容を全体としてdestinationに配置しているので、destinationディレクトリは/で終わります。

2
Rajneesh Gadge

私は、cpが隠しファイルを常にコピーするわけではないことを見てきました。もしあなたがすべてのlinux/unix方言に渡って働くように思われるコマンドが欲しいなら、あなたが使うべきである:

cd /etc/skel
find | cpio -pdumv /home/user
1
Mikael Nyborg