it-swarm-vi.com

cung cấp đầu ra grep cho rm

Tôi đang cố gắng chuyển grep xuất thành rm, nhưng nó tạo ra những thứ vô dụng. Có bất kỳ chuyển đổi cần thiết cho rm? Hoặc có thể rm có thể được cung cấp trực tiếp regrec không?

ls | grep '^\[Daruchini'| rm

rm: thiếu toán hạng Hãy thử `rm --help 'để biết thêm thông tin.

50
CodeBladeRunner

Bạn cần sử dụng xargs để biến đầu vào tiêu chuẩn thành đối số cho rm.

$ ls | grep '^Dar' | xargs rm

(Coi chừng các ký tự đặc biệt trong tên tệp; với GNU grep, bạn có thể thích

$ ls | grep -Z '^Dar' | xargs -0 rm

)

Ngoài ra, trong khi Shell không sử dụng biểu thức chính quy, đó là một mẫu đơn giản:

$ rm Dar*

(trong khi đó, tôi nghĩ rằng tôi cần ngủ nhiều hơn.)

61
geekosaur

Không phân tích đầu ra của ls .

Ở đây, rất đơn giản để có được Shell để lọc các tệp bạn muốn. Lưu ý rằng đó là Shell đang mở rộng mẫu Dar*, không phải lệnh rm. Việc mở rộng mẫu được thực hiện bởi Shell được gọi là globalbing .

rm Dar*

Trong trường hợp phức tạp hơn, hãy tra cứu lệnh find.

Nếu bạn muốn phân định đầu ra của grep theo dòng mới thay vì khoảng trắng, bạn có thể chỉ định điều đó cho xargs thông qua -d Lựa chọn.

$ ls | grep '^Dar' | xargs -d '\n' rm

(như được mô tả trong này câu hỏi)

3
mherzl

Để truyền đầu ra dưới dạng đối số, tôi có xu hướng sử dụng vòng lặp while vì tôi không quen với xargs.

ls | grep '^Dar' | while read line; do rm "$line";done;
2
Mitms

Trên Catalina 10.15.3, với zsh, cách tôi tìm thấy để xử lý các dòng mới và khoảng trắng là:

 Sudo find / | grep -i 'yourString' | tr '\n' '\0' | xargs -0 -n1 rm -r 

Nói cách khác, bằng cách dịch các dòng mới không có khoảng trắng (tr\n thành\0) trước khi xóa nó bằng "rm -0".

Ngoài ra, tôi luôn sử dụng 'find' + 'grep -i' vì 'find -iname' đôi khi không tạo ra bất cứ điều gì.

Một lưu ý cuối cùng: nó tìm và xóa các tệp và thư mục khớp với 'yourString'. Chỉ dành cho các tệp, chỉ định "find -type f", và sau đó tùy chọn "-r" cho rm là vô ích.

0
YvUh

Lệnh tốt nhất cho tôi là:

find ./Daruchini* -exec rm {}\;
0
Bodale