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 source
và 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 source
và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 FILE
là 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 cp
chí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 extglob
bạ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ó.