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 cp
trong 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ừ x
tậ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 cp
trong 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ừ x
tập tin?
Câu trả lời:
Trong bash
bạ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 extglob
với
$ shopt -u extglob
find
là 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 -aP
tắ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.
-rP
thay vì -aP
nếu bạn muốn lặp lại. -a
là để 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.
rsync
khô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ụ: zsh
hỗ trợ cú pháp này:
$ cp ^x /path/to/destination
Trong đó ^x
có 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*
bash
gì 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, bash
và 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 find
như 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