Có cách nào để sử dụng lệnh 'cp' để sao chép một thư mục và loại trừ các tệp / thư mục con nhất định trong đó không?
Có cách nào để sử dụng lệnh 'cp' để sao chép một thư mục và loại trừ các tệp / thư mục con nhất định trong đó không?
Câu trả lời:
Sử dụng rsync:
rsync -avr --exclude='path1/to/exclude' --exclude='path2/to/exclude' source destination
Lưu ý rằng sử dụng sourcevà source/là khác nhau. Dấu gạch chéo có nghĩa là sao chép nội dung của thư mục sourcevào destination. Không có dấu gạch chéo, có nghĩa là sao chép nguồn thư mục vào destination.
Ngoài ra, nếu bạn có nhiều thư mục (hoặc tệp) để loại trừ, bạn có thể sử dụng --exclude-from=FILE, đâu FILElà tên của tệp chứa tệp hoặc thư mục để loại trừ.
--exclude cũng có thể chứa các ký tự đại diện, chẳng hạn như --exclude=*/.svn*
Sao chép từ: https://stackoverflow.com/a/2194500/749232
Nếu bạn muốn sử dụng cpchính nó:
find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'
Điều này giả định cấu trúc thư mục đích giống như của nguồn.
Sao chép từ: https://stackoverflow.com/a/4586025/749232
Vào cuối trò chơi nhưng đây là một giải pháp rất khác bằng cách sử dụng bash và cp đơn giản: bạn có thể sử dụng một đặc tả tệp toàn cầu trong khi có một số tệp bị bỏ qua.
Giả sử thư mục chứa các tệp:
$ ls *
listed1 listed2 listed3 listed4 unlisted1 unlisted2 unlisted3
Sử dụng biến GLOBIGNORE :
$ export GLOBIGNORE='unlisted*'
$ ls *
listed1 listed2 listed3 listed4
Hoặc với các loại trừ cụ thể hơn:
$ export GLOBIGNORE='unlisted1:unlisted2'
$ ls *
listed1 listed2 listed3 listed4 unlisted3
Hoặc sử dụng kết hợp phủ định :
$ ls !(unlisted*)
listed1 listed2 listed3 listed4
Điều này cũng hỗ trợ một số mẫu chưa từng có:
$ ls !(unlisted1|unlisted2)
listed1 listed2 listed3 listed4 unlisted3
shopt -s extglobbạn cũng không cần xuấtGLOBIGNORE: phải sửa đổi hành vi của trình bao hiện tại, hầu hết các chương trình con sẽ không quan tâm đến nó.