Câu hỏi Làm thế nào để sao chép với cp để bao gồm các tập tin ẩn và thư mục ẩn và nội dung của họ?


Làm sao tôi có thể làm cp -r sao chép hoàn toàn tất cả các tệp và thư mục trong một thư mục

Yêu cầu:

  • Bao gồm các tệp ẩn và thư mục ẩn.
  • Hãy là một lệnh duy nhất với một lá cờ để bao gồm các bên trên.
  • Không cần phải dựa vào kết hợp mẫu.

Tội nghiệp của tôi, nhưng làm việc, hack là:

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

Làm thế nào tôi có thể làm điều này tất cả trong một lệnh mà không có sự phù hợp với mô hình? Tôi cần sử dụng cờ nào?


297
2017-10-27 19:46


gốc


Thêm câu trả lời ở đây, mặc dù họ không nhìn tốt; serverfault.com/questions/3154/… - Roel Van de Paar
Xin vui lòng, Eleven81, hãy xem xét việc thay đổi câu trả lời được chấp nhận cho câu trả lời đó bởi @bruno pereira, bởi vì nó tránh tạo thư mục mới. Nếu không, hãy bình luận này là một cảnh báo cho người đọc mới để kiểm tra câu trả lời khác (được bình chọn nhiều nhất). Tx. - Dr Beco


Các câu trả lời:


Không chỉ định tệp:

cp -r /etc/skel /home/user

(Lưu ý rằng /home/user không tồn tại, nếu không nó sẽ tạo /home/user/skel.)


215
2017-10-27 19:55



Có thể sử dụng một cái gì đó tương tự nếu /home/user/skel  làm hiện hữu? - bradley.ayers
@ bradley.ayers Tôi nghĩ rằng người ta có thể sao chép vào một thư mục con tạm thời sau đó chuyển chúng lên cấp cao hơn (kể từ khi di chuyển trong cùng một ổ đĩa nhanh). Ít hơn lý tưởng, nhưng ngắn hơn so với các giải pháp khác cho tôi. - Halil Özgür
@ bradley.ayers Câu trả lời của Bruno dưới đây giải quyết câu hỏi của bạn - Mark
Giải pháp này không hiệu quả với tôi. Nó không sao chép các tập tin ẩn. Tôi đang sử dụng CentOS phát hành 6.5. @ Giải pháp của Bruno đã thực hiện thủ thuật. - Technext
Dưới ubuntu / debian, đặt thư mục 'skel' bên trong thư mục đích chứ không phải các tệp đệ quy bên trong skel. Sử dụng -T (không có mục tiêu) cho mỗi bên dưới để sử dụng hợp lý. (-rT cho đệ quy) - bshea


Cho phép nói rằng bạn đã tạo thư mục mới (hoặc sẽ tạo một thư mục) và muốn sao chép các tệp vào thư mục sau khi thư mục được tạo

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

Điều này sẽ sao chép tất cả các tập tin / thư mục đệ quy từ /etc/skel vào thư mục đã tồn tại được tạo trên dòng đầu tiên.


378
2017-12-12 22:00



Nếu tôi không hiểu sai, điều này không sao chép các tệp ẩn / chấm. - Halil Özgür
Hoạt động tốt cho tôi. Lưu ý rằng '.' rất quan trọng để nó hoạt động. - Mark
Nó hoạt động, nhưng, tại sao? Không thể tìm thấy một tham chiếu đến điều này trong hướng dẫn sử dụng. - Julien Palard
Tôi nghĩ rằng nó hoạt động vì bình thường, điều này sẽ tạo ra một thư mục mới với tên của thư mục cuối cùng trong đối số đầu tiên. Tuy nhiên, vì tên đó là ., hành vi này sẽ yêu cầu nó tạo một thư mục đã tồn tại, vì vậy nó chỉ bỏ qua bước đó. - Zenexer
@Technext Hình ảnh mặc định trong bash không bao gồm tên tệp bắt đầu bằng ., để thay đổi bạn cần sử dụng shopt -s dotglob lệnh trước để có thể bao gồm các tệp đó. Vì vậy *, theo mặc định, bạn đang yêu cầu sao chép tất cả các tệp đệ quy từ thư mục này có thể được mở rộng bằng cách sử dụng * (mặc định không bao gồm các tệp ẩn). Trong khi ở đầu kia với . bạn đang sử dụng cp để đệ quy sao chép tất cả mọi thứ từ "thư mục này". - Bruno Pereira


bash chính nó có một giải pháp tốt, nó có một shell option, Bạn có thể cp, mv và như vậy:

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

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

Giải pháp trên là tiêu chuẩn của bash

CHÚ THÍCH:

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

59
2018-02-06 01:14



Đó là hữu ích khi bạn muốn sao chép nội dung chỉ mà không cần tạo thư mục mới bên trong đích. Đặc biệt khi dir đích là điểm gắn kết. - kaszynek
Đây thực sự là câu trả lời hay nhất và đạt được trọng tâm của câu hỏi .. - Stephen
nó là setopt cho zsh, trong trường hợp bất cứ ai khác đang tự hỏi. - Pat


Các phương tiện chính xác để làm điều này là sử dụng -T (--no-target-directory) tùy chọn và sao chép đệ quy các thư mục (không có dấu gạch chéo, dấu hoa thị, v.v.), tức là:

cp -rT /etc/skel /home/user

Điều này sẽ sao chép nội dung của /etc/skel đến /home/user (bao gồm cả các tệp ẩn), tạo thư mục /home/user nếu nó không tồn tại; tuy nhiên -T tùy chọn ngăn chặn nội dung của /etc/skel được sao chép vào một thư mục mới /home/user/skel nên thư mục /home/user hiện hữu.


45
2017-09-08 21:50



Câu trả lời chính xác. +1 - bshea
đây thực sự là câu trả lời đúng - Gaetan


Sử dụng rsync:

rsync -rtv source_folder/ destination_folder/


23
2018-02-20 13:18





Nếu thư mục nguồn và đích của bạn có cùng tên, ngay cả khi thư mục đích tồn tại, bạn có thể chỉ cần gõ:

cp -R /etc/skel /home/

Thao tác này sẽ sao chép thư mục / etc / skel vào / home /, bao gồm các tệp và thư mục ẩn.

Cuối cùng, bạn có thể sao chép thư mục và đổi tên nó thành một dòng:

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

3
2018-05-16 08:38



Hoặc bạn chỉ có thể sử dụng cp -r /etc/skel /home/user để đổi tên skel đến user... - David
Đúng vậy, chỉ khi / home / user không tồn tại. - Gabriel Hautclocq


rsync là tốt, nhưng một lựa chọn khác:

cp -a src/ dst/

Từ trợ giúp chính:

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

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

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

2
2017-08-28 17:46



Tôi luôn sử dụng cp -r. Cảm ơn bạn đã đề cập đến cp -a - Pinaki Mukherjee


Bạn có thể sử dụng rsync.

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

Bạn thậm chí có thể sao chép qua ssh

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

Có nhiều cờ khác nhau mà bạn có thể sử dụng:     -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.

Trang người dùng Rsync


2
2018-01-17 17:32





Lưu ý rằng có một thủ thuật dòng lệnh (hoạt động trong ít nhất, sh, bashksh): Chỉ cần hậu tố từ thư mục có dấu gạch chéo. Điều này sẽ đổ nội dung của từ thư mục vào đến thư mục (trớ trêu thay, lần đầu tiên tôi học về mẹo này khi sử dụng  rsync).

Thí dụ:

/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

1
2018-05-12 20:00