unix – 隠しファイルや隠しディレクトリとその内容を含むように cp でコピーするには?

cp recursive unix

cp -rにディレクトリ内のファイルとディレクトリを絶対的にコピーさせるにはどうすればいいのでしょうか

Requirements:

  • 隠しファイルや隠しディレクトリを含めます
  • 上記を含むようにフラグを付けて1つのコマンドにしてください
  • パターンマッチングに頼る必要は全くありません

私の不細工だけど働いているハックは

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

パターンマッチングを行わずに、コマンドですべてを行うにはどうすればいいのでしょうか?どのフラグを使用する必要がありますか?

  478  eleven81  2009-10-27


ベストアンサー

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

cp -r /etc/skel /home/user

(/home/userは既に存在してはいけないことに注意してください。そうでなければ/home/user/skelを作成します)

308  Randy Orrison  2009-10-27


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

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

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

553  Bruno Pereira  2011-12-12


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

cp -rT /etc/skel /home/user

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

138  TechnocratiK  2015-09-08


bash自体には良い解がある、shell optionがある、cpができる、mvができる、などなど

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

and

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

上記の解法はbashの標準です

NOTE:

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

75  PersianGulf  2013-02-06


Use rsync:

rsync -rtv source_folder/ destination_folder/

32  user1084282  2014-02-20


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

8  Wink Saville  2014-08-28


一番シンプルな方法は

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

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

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

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

6  simhumileco  2018-06-06


rsyncを使うといいでしょう

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

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

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

いろいろなフラグがあります。-a, –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 ページ

5  RoshP  2016-01-17


ソースディレクトリとターゲットディレクトリが同じ名前であれば、たとえターゲットディレクトリが存在していたとしても、単に入力するだけでOKです

cp -R /etc/skel /home/

これは /etc/skel ディレクトリを /home/ にコピーします

最終的には、ディレクトリをコピーして一行で名前を変更することができます

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

4  Gabriel Hautclocq  2013-05-16


同じ問題の解決策を探してググってここに来たのですが、FINDで簡単にできることに気がつきました。シェルやインストールされていないかもしれない特殊なユーティリティに依存しないという利点があります

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

トレイリングスラッシュでトリックを試してみましたが、私にはうまくいきませんでした

3  Linus  2015-07-24


コマンドラインのトリックがあることに注意してください (少なくとも sh, bash, ksh で動作します)。from ディレクトリの後にスラッシュを付けてください。これは from ディレクトリの内容を to ディレクトリに流し込みます (皮肉なことに、私は rsync を使っているときにこのトリックを初めて知りました)

Example:

/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  2015-05-12


この問題に対する私の解決策は、すべてのファイル(.ファイルを含む)をパーミッションを保持したままターゲットディレクトリにコピーしなければならないときに、次のようになります。(既に存在する場合は上書き)

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

yesは保存先ファイルを自動的に上書きするため、rは再帰的、vは冗長、pはパーミッションを保持するためです

ソースパスが / で終わっていないことに注意してください (つまり、すべてのファイル/ディレクトリと .ファイルがコピーされていることになります)

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

2  Rajneesh Gadge  2018-01-30


cp は常に隠しファイルをコピーするわけではないことを見てきましたが、もし linux/unix のすべての方言で動作するようなコマンドが必要ならば、これを使ってみてください

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

1  Mikael Nyborg  2019-02-13


少なくともK3b 2.0.3の時点では、ディレクトリがプロジェクトに追加されたときにポップアップする質問ボックスがあります。いいね!

-2  Fred James  2016-12-14


タイトルとURLをコピーしました