Làm cách nào để di chuyển tất cả các tập tin đầu ra từ một lệnh?


22

Tôi có lệnh grep này để tìm các tệp mà không có từ Đính kèm trong đó.

grep -L -- Attachments *

Tôi muốn di chuyển tất cả các tệp được xuất ra từ lệnh đó. Làm thế nào để tôi làm điều đó trong bash? Tôi có sử dụng đường ống không? Tôi có sử dụng câu lệnh if / then dài dòng hơn trong tập lệnh đầy đủ không?

Câu trả lời:


18

Nếu bạn biết rằng không có gì nếu tên tệp chứa các dòng, tab, khoảng trắng hoặc kết hợp toàn cầu mới có thể tạo ra sự trùng khớp, thì điều này có thể dễ dàng hơn cho trường hợp một lần:

mv $(grep -L Attachments *) dest_dir

36

Những gì bạn muốn làm là sử dụng một tùy chọn ống và greps -Z:

Sử dụng GNU grep và mv

grep -LZ -- Attachments * | xargs -0 mv -t target_directory

Việc -Zkết hợp với xargs -0xử lý bất kỳ tên tập tin với các ký tự đặc biệt.

Sử dụng BSD grep và mv (như trên MacOS X)

grep -L --null -- Attachments * |
while IFS= read -r -d "" file; do 
    mv "./$file" target_directory
done

Trên BSD, grep -Zcó nghĩa là giải nén , grep --nullhoạt động trên cả BSD và GNU. BSD mvthiếu tùy chọn-t

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.