Không.
Các cp
lệnh không có khả năng để xử lý bất kỳ của các đối số của nó như là biểu thức thông thường. Ngay cả các ký tự đại diện cũng không được xử lý bởi nó (hoặc hầu hết các tệp thực thi); thay vì chúng được xử lý bởi vỏ.
cp test/* test2/
thực sự được mở rộng bằng bash và tất cả những gì cp
thực sự nhìn thấy đối số của nó là cp test/file1 test/file2 test/file3 test2/
(hoặc bất cứ điều gì phù hợp dựa trên nội dung thực tế của test/
).
Ngoài ra, tôi không nghĩ biểu thức của bạn [^\.php]
, sẽ khớp với những gì bạn muốn (nó không khớp với các tệp có chứa .php
).
Bạn có thể muốn xem xét find
tiện ích để lọc ra danh sách các tệp dựa trên biểu thức chính quy, sau đó sử dụng xargs
để áp dụng danh sách tệp được trả về cho cp
lệnh (giả sử find không có trình xử lý tích hợp để sao chép tệp; Tôi ' m không quen thuộc với công cụ này).
Bạn có thể thử:
find . ! -iregex ".*\.php.*" -exec cp {} /destination/folder/ \;
Điều này nói rằng để tìm kiếm thư mục hiện tại một cách đệ quy cho các tệp không chứa ".php" trong đường dẫn và sao chép chúng vào /destination/folder/
.
Theo yêu cầu, phân tích cụ thể hơn về các đối số:
.
- Vị trí để bắt đầu tìm kiếm - trong trường hợp này, thư mục hiện tại
!
- Toán tử "Không", đảo ngược kết quả của lần kiểm tra tiếp theo
-iregex
- Kiểm tra biểu thức chính quy không phân biệt chữ hoa chữ thường. Đối số tiếp theo là biểu thức.
".*\.php.*"
- Kết hợp biểu thức chính quy <Anything>.php<Anything>
- Bất kỳ tệp nào có ".php" ở đâu đó trong đường dẫn. (Lưu ý, bao gồm cả trong thư mục chứa ".php" trong tên, bạn cần một biểu thức phức tạp hơn để chỉ khớp với các tệp)
-exec
- Thực hiện một lệnh nếu các kiểm tra trước trả về đúng. Đối số tiếp theo là lệnh, tất cả các đối số còn lại sẽ ;
được truyền cho lệnh. đó {}
là một đối số đặc biệt đại diện cho tên tệp.
cp
- Lệnh find` nên chạy trên mỗi tên đường dẫn phù hợp.
{}
- Đường dẫn đến tệp được tìm thấy, được chuyển đến cp
dưới dạng đối số để nó biết tệp nào cần sao chép
/destination/folder/
- đối số được chuyển đến cp
, cho biết cp
nơi cần sao chép tệp vào.
\;
- Đây là kẻ ;
hủy diệt -exec
đang tìm kiếm. Chúng tôi thoát nó bằng cách \
để shell của bạn không cố phân tích nó và thay vào đó, nó cung cấp nó như là một đối số cho lệnh ( find
)
Đó là khá khó khăn để viết một biểu thức chính quy mà phù hợp với "chuỗi mà không có .php
", vì vậy chúng tôi thay vì nói find
để tìm kiếm chuỗi làm chứa .php
và sau đó nghịch kết quả với !
.
find . -name [^\.php] -exec cp {} /path/to/location \;
hãy cẩn thận cho các tập tin với các ký tự đặc biệt.