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 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?
Câu trả lời:
Đơ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/ {} +
\;
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.
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
shopt -s extglob
phải hoạt động, nếu nó đã bị vô hiệu hóa.
shopt -s extglob
như mô tả của @BarryKelly. Với điều đó, nó hoạt động hoàn hảo.
!()
... 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 / extglob và mô hình .
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
-r
nếu bạn đang đồng bộ hóa các thư mục
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/
Default.png
tồn tại trong hai thư mục, nó sẽ thay thế một trong destdir
bở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.png
cái đã tồn tại destdir
.
Đ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
cp `ls | grep -v Default.png` destdir
# chattr +i /files_to_exclude
# cp source destination
# chattr -i /files_to_exclude
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ể !
[...]
) 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
.