Đối số còn thiếu với -exec là gì?


15

Tôi sử dụng lệnh sau để xóa một thư mục, các tệp và thư mục trên 30 ngày và chuyển chúng sang thư mục lưu trữ mà tôi có thể xóa sau vài tuần nếu không ai yêu cầu trả lại tệp của họ. Thư mục đích có thư mục con theo tên người dùng, thư mục lưu trữ cũng vậy.

Đây là lệnh tôi sử dụng:

find /path/to/directory/username/ -mtime +30 -exec mv "{}" /path/to/archive/username/ \;

Tôi đề nghị một phiên bản sửa đổi của này để trả lời một câu hỏi về hỏi ubuntu, một người dùng khác chỉnh sửa mã để thay đổi cuối dòng \;cho +vì nó nhanh hơn (và nhiều hơn nữa đúng không?). Xem tại đây

Tuy nhiên, sử dụng +theo cách này hoạt động nếu -execlệnh là ls -lhnhưng không phải trong lệnh thực tế mà tôi sử dụng. Nếu tôi dùng thử, +tôi nhận được thông báo lỗi:

find: missing argument to '-exec'

Tôi không hiểu tại sao nó hành xử theo cách này, hoặc lệnh chính xác sẽ là gì. Xin đừng chỉ chỉnh sửa lệnh, tôi muốn hiểu hơn là chỉ làm theo một gợi ý một cách mù quáng.


Bạn đang đề cập đến câu trả lời này ? Điều này có thể giải thích tại sao
Wilf

Cảm ơn @Wilf tôi đã cập nhật để hiển thị câu trả lời nào đã được chỉnh sửa. Liên kết bạn cung cấp, có thêm một liên kết giải thích nó theo cách mà não tôi có thể đối phó.
Arronical 8/07/2015


Cảm ơn @souravc theo cách tuần hoàn xuất sắc mà câu hỏi đó là của người dùng đã chỉnh sửa lệnh của tôi! Cuối cùng tôi nhận được nó +cung cấp nhiều đối số cho cùng một lệnh, nhưng mvkhông thể đối phó với điều đó!
Arronical

@Arronical mv can, xem câu trả lời của tôi ^^
hỗn loạn

Câu trả lời:


19

Người dùng trong bài đăng đó có thể nói rằng +dấu hiệu ở cuối -execlệnh nhanh hơn, nhưng không phải tại sao.

Giả sử findlệnh trả về các tệp sau:

/path/to/file1
/path/to/file2
/path/to/file3

Lệnh bình thường -exec( -exec command {} \;) chạy một lần cho mỗi tệp phù hợp. Ví dụ:

find ... -exec mv {} /target/ \;

Thi hành:

mv /path/to/file1 /target/
mv /path/to/file2 /target/
mv /path/to/file3 /target/

Nếu bạn sử dụng +dấu ( -exec command {} +), lệnh sẽ được tạo bằng cách thêm nhiều tệp khớp vào cuối lệnh. Ví dụ:

find ... -exec mv -t /target/ {} +

Thi hành:

mv -t /target/ /path/to/file1 /path/to/file2 /path/to/file3

Để sử dụng +cờ một cách chính xác, đối số cần xử lý phải ở cuối lệnh, không phải ở giữa. Đó là lý do tại sao findtrows missing argument to '-exec'trong ví dụ của bạn; nó nhớ đóng cửa {}.


Tôi đã luôn tự hỏi tại sao find -execđòi hỏi phải là {}đối số cuối cùng, khi được sử dụng với +. Bất cứ ai cũng biết tại sao quyết định thiết kế đó được đưa ra, thay vì để các cấu trúc như dòng lệnh của OP hoạt động?
Peter Cordes

11

Người dùng giải thích chỉnh sửa của họ ....

'+' Terminator của exec nhanh hơn '\;'  xem https://askubfox.com/questions/558817/what-is-the-difference-b between-USE-and-in-expec-common;  và tạo một tập tin sao lưu từ tập tin gốc là ý tưởng tốt

... sử dụng liên kết này . Tôi nghĩ về cơ bản thay vì sử dụng nhiều lệnh, nó sẽ gửi tất cả tên tệp cho một thể hiện lệnh, để tăng tốc mọi thứ. Đây là một ví dụ từ đây :

Sử dụng -exec với dấu chấm phẩy ( find . -exec ls '{}' \;), sẽ thực thi

ls file1
ls file2
ls file3

Nhưng nếu bạn sử dụng dấu cộng thay thế ( find . -exec ls '{}' \+), tất cả tên tệp sẽ được chuyển dưới dạng đối số cho một lệnh:

ls file1 file2 file3

Có các hình thức khác có sẵn bằng cách sử dụng ;+là tốt (từ đây :)

Do đó, cú pháp ví dụ sau được phép cho lệnh find:

find . -exec echo {} \;
find . -exec echo {} ';'
find . -exec echo {} ";"
find . -exec echo {} \+
find . -exec echo {} +

TUY NHIÊN, tôi không chắc chắn điều này sẽ hoạt động với lệnh di chuyển, vì nó là cú pháp mv [OPTION]... SOURCE DEST, trừ khi -ttùy chọn hoặc tương tự được sử dụng. Tuy nhiên, nó nên hoạt động mà lskhông có tùy chọn bổ sung, v.v. vì chúng có thể hiểu khi nhiều tên tệp được đưa ra. Cũng +có thể cần phải được trốn thoát (tức là \+)


Cả hai câu trả lời tuyệt vời, nhưng tôi đã phải đưa ra sự hỗn loạn vì nhanh hơn một chút và giải thích mv -tcả hai +1.
Arronical 8/07/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.