Vì vậy, bạn có thể sử dụng *làm thẻ đại diện cho tất cả các tệp khi sử dụng cptrong ngữ cảnh của một thư mục. Có cách nào để sao chép tất cả các tập tin ngoại trừ xtập tin?
Vì vậy, bạn có thể sử dụng *làm thẻ đại diện cho tất cả các tệp khi sử dụng cptrong ngữ cảnh của một thư mục. Có cách nào để sao chép tất cả các tập tin ngoại trừ xtập tin?
Câu trả lời:
Trong bashbạn có thể sử dụng extglob:
$ shopt -s extglob # to enable extglob
$ cp !(b*) new_dir/
nơi !(b*)loại trừ tất cả b*các tập tin.
Sau này bạn có thể vô hiệu hóa extglobvới
$ shopt -u extglob
findlà cách duy nhất trong tcsh:find . -maxdepth 1 ! -name "exclude*" -exec cp -t destination {} \+
Rupync xử lý việc này độc đáo.
Ví dụ sao chép tất cả: rsync -aP /folder1/* /folder/2
Ví dụ sao chép tất cả với loại trừ: rsync -aP --exclude=x /folder1/* /folder2/
Công -aPtắc:
a: Tương tự cp -a, đệ quy, v.v ... P: Hiển thị tiến trình, một tính năng hay của rsync.
-rPthay vì -aPnếu bạn muốn lặp lại. -alà để lưu trữ. Không chắc chắn nếu điều này thay đổi hoặc nếu nó chỉ khác trên MacOS.
rsynckhông có tùy chọn để làm cho nó đệ quy. Ví dụ : rsync --recursive -P --exclude=x /folder1/* /folder2/. (Chỉ được thử nghiệm trên Ubuntu)
Đây không phải là một tính năng của cp, nó là một tính năng của trình bao của bạn (nó mở rộng *nghĩa là tất cả các tệp không có dấu chấm), vì vậy câu trả lời phụ thuộc vào việc bạn đang sử dụng trình bao nào. Ví dụ: zshhỗ trợ cú pháp này:
$ cp ^x /path/to/destination
Trong đó ^xcó nghĩa là "tất cả các tệp ngoại trừ x"
Bạn cũng có thể kết hợp các mẫu lựa chọn và loại bỏ lựa chọn, ví dụ để sao chép tất cả các tệp wav ngoại trừ các tệp có chứa xyz, bạn có thể sử dụng:
cp *.wav~*xyz*
bashgì về ?
Cũng có thể được thực hiện trong vỏ bourne cũ (di động / tương thích) đơn giản bằng nhiều cách khác nhau với các công cụ tiêu chuẩn theo nhiều cách kém thanh lịch hơn so với sử dụng các lệnh toàn cầu hoặc trình bao vỏ tiên tiến với các tùy chọn loại trừ tích hợp.
Nếu không có quá nhiều tệp (và không có tên bao gồm khoảng trắng và / hoặc ngắt dòng), đây có thể là một cách:
cp `ls | egrep -v '^excludename$'` destdir/.
Chắc chắn, bashvà các công cụ GNU rất tuyệt vời và mạnh mẽ, nhưng chúng vẫn không phải lúc nào cũng có sẵn. Nếu bạn có ý định đưa nó vào một kịch bản di động, tôi sẽ đề xuất findnhư trong nhận xét của Rush.
Nếu bạn muốn sao chép mọi thứ trong một thư mục (bao gồm cả các thư mục con) vào một thư mục con cụ thể:
cp -R $(ls | grep -v '^subdir$') subdir/
Hoạt động với sh, bash, zsh (ít nhất).
cp -R * subdir/
cp(không phải từ bash/ sh), " cp: cannot copy a directory, ‘subdir’, into itself, ‘subdir/subdir’". Bản sao hoàn thành chính xác, mặc dù. Thật không may, biến thể của bạn bị hỏng với bất kỳ tên tệp nào chứa dấu chấm câu có dấu cách hoặc dấu cách. Xem unix.stackexchange.com/q/128985/135943
extglob là cách tốt nhất cho đến nay tôi đoán.
Một cách khác là sử dụng
cp $(ls --ignore=x) subdir/
$v.v.) Không bao giờ phân tích đầu ra của ls. unix.stackexchange.com/q/128985/135943