даючи греп-вихід у rm


47

Я намагаюся grepвивести на трубку вихід rm, але він видає непотрібні речі. Чи потрібен якийсь перемикач rm? Або можна rmбезпосередньо надати повторне вираження?

ls | grep '^\[Daruchini'| rm

rm: відсутній операнд Спробуйте `rm --help 'для отримання додаткової інформації.


Завжди копіюйте та вставляйте повідомлення про помилки. (Я вставив фактичне повідомлення про помилку на користь майбутніх читачів. Але я міг це зробити лише тому, що в цьому випадку є лише одне можливе повідомлення про помилку. Більшість випадків важливо мати точне повідомлення про помилку, щоб зрозуміти проблему. . Тому завжди копіюйте і вставляйте всі повідомлення про помилки в повному обсязі.)
Жил "ТАК - перестаньте бути злами"

Відповіді:


57

Вам потрібно використовувати, xargsщоб перетворити стандартний вхід в аргументи для rm.

$ ls | grep '^Dar' | xargs rm

(Остерігайтеся спеціальних символів у назви файлів; ви можете скористатися GNU grep

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

)

Крім того, хоча оболонка не використовує регулярні вирази, це проста модель:

$ rm Dar*

(тим часом, я думаю, мені потрібно більше сну.)


2
Якщо припустити, що запитувач не помилився, коли (-ла) він (-ла) розмістив (-ла) питання (-и), він переслідує rm Dar*, ні rm !(Dar*).
Жил "ТАК - перестань бути злим"

... правильно, так, я застряг у zsh ^режимі (подібний до basg !речі).
geekosaur

1
+1 Чудова відповідь, мені довелося додати ще | tr "\n" "\0"до цього моменту xargs. Якщо дивитися на це повідомлення: stackoverflow.com/questions/20307299 / ...
Адам Plocher

5

Не розбирайте вихідls .

Тут дуже просто отримати оболонку для фільтрації потрібних файлів. Зауважте, що оболонка розширює шаблон Dar*, а не rmкоманда. Розширення візерунка, виконане оболонкою, називається глобулінг .

rm Dar*

У більш складних випадках шукайте findкоманду.


3

Якщо ви хочете розмежувати вихідні grepрядки за новими рядками, а не пробілами, ви можете вказати це за xargsдопомогою -dпараметра.

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

(як описано в цьому запитанні)


2

Для передачі виводу в якості аргументу я схильний використовувати цикл час, оскільки я не знайомий з xargs.

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

це єдиний, хто працював у моєму випадку.
марбель

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.