BASH sao chép tất cả các tệp ngoại trừ một tệp


110

Tôi muốn sao chép tất cả các tệp từ một dir ngoại trừ một tệp có tên là Default.png. Có vẻ như có một số cách để làm điều này. Điều gì có vẻ hiệu quả nhất đối với bạn?


Tại sao bạn cần nó để bỏ qua tệp đó, thay vì chỉ xóa nó sau khi sao chép nó? Nó đã tồn tại trong thư mục đích chưa?
Lasse V. Karlsen

1
Có một tệp có cùng tên đã tồn tại trong dir đích.
Joe Cannatti

@ LasseV.Karlsen: Hoặc bạn có thể muốn tiết kiệm thời gian sao chép nó, nếu đó là một tệp lớn. Tôi quan tâm đến điều này nhưng loại trừ một thư mục hơn là một tệp.
Nikana Reklawyks

Câu trả lời:


54

Đơn giản, nếu src/chỉ chứa các tệp:

find src/ ! -name Default.png -exec cp -t dest/ {} +

Nếu src/có thư mục con, điều này sẽ bỏ qua chúng, nhưng sẽ sao chép các tệp bên trong chúng:

find src/ -type f ! -name Default.png -exec cp -t dest/ {} +

Nếu src/có các thư mục con, điều này không tái diễn vào chúng:

find src/ -type f -maxdepth 1 ! -name Default.png -exec cp -t dest/ {} +

5
Điều này hóa ra là tốt nhất đối với tôi vì có vẻ như OS X xuất xưởng mà không được kích hoạt tính năng cầu.
Joe Cannatti

6
@Max \;thực hiện lệnh một lần cho mỗi tệp. +chạy lệnh một lần và chuyển tất cả các tên tệp cho nó cùng một lúc (tùy thuộc vào giới hạn độ dài dòng lệnh). +nói chung hiệu quả hơn một chút.
John Kugelman

149

Nên như sau:

cp -r !(Default.png) /dest

Nếu sao chép vào một thư mục được lồng trong thư mục hiện tại (được gọi là ví dụ trong trường hợp bên dưới), bạn cũng cần phải bỏ qua thư mục đó:

cp -r !(Default.png|example) /example

17
Điều này tạo ra -bash:: không tìm thấy sự kiện!
Joe Cannatti

Bạn có đang sao chép các tệp vào một thư mục được lồng trong thư mục mà bạn sao chép từ đó không?
Jon

47
Điều này yêu cầu shopt -s extglobphải hoạt động, nếu nó đã bị vô hiệu hóa.
Barry Kelly

5
Có vẻ như OS X cần sử dụng shopt -s extglobnhư mô tả của @BarryKelly. Với điều đó, nó hoạt động hoàn hảo.
Kat

Nhiều năm trên Bash và không biết về !()... Beautiful! Đối với những người --like tôi-- cảm thấy đó là thời gian để nghiên cứu / đánh giá bash , sau đây là các liên kết có liên quan liên quan đến câu hỏi này / câu trả lời: shopt / extglobmô hình .
Brandt

73

rsync đã thay thế cp / scp của tôi trong một thời gian dài:

rsync -av from/ to/ --exclude=Default.png

-a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
-v, --verbose               increase verbosity

Nếu tôi muốn loại trừ hai tệp khác nhau, làm cách nào để sử dụng tệp này?
Pulkit Bansal

nhiều đối số --exclude = được hỗ trợ. Và đừng quên tranh luận -rnếu bạn đang đồng bộ hóa các thư mục
Rian Sanderson

5

Tôi chỉ làm:

cp srcdir/* destdir/ ; rm destdir/Default.png

trừ khi các tệp lớn. Nếu không sử dụng vd

find srcdir -type f/ |grep -v Default.png$ |xargs -ILIST cp LIST destdir/

1
Lệnh đầu tiên không phải là những gì OP yêu cầu. Nếu Default.pngtồn tại trong hai thư mục, nó sẽ thay thế một trong destdirbởi một trong srcdir, sau đó xóa các đã sao chép Default.png. Thay vào đó, OP muốn giữ lại Default.pngcái đã tồn tại destdir.
SnowFrog

2
Làm thế nào về default.png đã tồn tại trong destdir? Solutioun của bạn sẽ không hoạt động.
Iman Mohamadi

2

Điều này hoạt động tuyệt vời để sao chép mọi thứ ngoại trừ mô-đun nút :) hãy tận hưởng và cảm ơn các câu trả lời ở trên mà tôi vừa thêm vào nó. Theo ý kiến ​​của tôi, Rsync tốt hơn CP vì bạn có thể thấy thanh tiến trình mà không cần yêu cầu.

   rsync -av fromDirectory/ ToDirectory/ --exclude=node_modules


-1
# chattr +i /files_to_exclude
# cp source destination
# chattr -i /files_to_exclude

-2

sử dụng tham số mở rộng của shell với regex

cp /<path>/[^not_to_copy_file]* .

Mọi thứ sẽ được sao chép ngoại trừ not_to_copy_file

- nếu có gì đó sai với điều này. Xin hãy chỉ ra cụ thể !


1
Chào mừng đến với SO. Thật không may, câu trả lời của bạn không đúng. Dấu ngoặc nhọn expresssion ( [...]) chứa một tập hợp các ký tự để so khớp, trong khi một phần đứng đầu ^sẽ tạo ra sự khớp với phần bổ sung của các ký tự được liệt kê. Trong ví dụ sau, không phải tập tin sẽ được liệt kê: touch not_to_copy_file to_copy_file ; ls [^not_to_copy_file]*bởi vì tất cả tên tập tin bắt đầu với bất kỳ ký tự sau đây sẽ được loại trừ: _cefilnopty.
rtx13
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.