давая вывод grep в rm

47

Я пытаюсь передать grepвывод rm, но он выводит бесполезные вещи. Требуется ли какой-либо переключатель для rm? Или может rmбыть предоставлено регулярное выражение непосредственно?

ls | grep '^\[Daruchini'| rm

rm: отсутствует операнд Попробуйте `rm --help 'для получения дополнительной информации.

CodeBladeRunner
источник
Всегда копируйте и вставляйте сообщения об ошибках. (Я вставил фактическое сообщение об ошибке для будущих читателей. Но я мог сделать это только потому, что в этом случае есть только одно возможное сообщение об ошибке. В большинстве случаев очень важно иметь точное сообщение об ошибке, чтобы понять проблему Так что всегда копируй и вставляй все сообщения об ошибках полностью.)
Жиль "ТАК - перестать быть злым"

Ответы:

57

Вы должны использовать, xargsчтобы превратить стандартный ввод в аргументы для rm.

$ ls | grep '^Dar' | xargs rm

(Остерегайтесь специальных символов в именах файлов; с GNU grep вы можете предпочесть

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

)

Кроме того, хотя оболочка не использует регулярные выражения, это простой шаблон:

$ rm Dar*

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

geekosaur
источник
2
Предполагая, что спрашивающий не ошибся, когда он (а) отправил вопрос, он (и) за ним rm Dar*, нет rm !(Dar*).
Жиль "ТАК - перестань быть злым"
... правильно, да, я застрял в zsh ^режиме (похоже на basg !вещь).
geekosaur
1
+1 Отличный ответ, я должен был добавить, | tr "\n" "\0"прежде чем xargsнемного. Видел в этом посте: stackoverflow.com/questions/20307299/…
Адам Плохер
5

Не анализируйте выводls .

Здесь очень просто заставить оболочку фильтровать нужные вам файлы. Обратите внимание, что оболочка расширяет шаблон Dar*, а не rmкоманда. Расширение шаблона, выполняемое оболочкой, называется globbing .

rm Dar*

В более сложных случаях ищите findкоманду.

Жиль "ТАК - перестань быть злым"
источник
3

Если вы хотите ограничить вывод grepсимволами новой строки, а не пробелами, вы можете указать это с xargsпомощью -dопции.

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

(как описано в этом вопросе)

mherzl
источник
2

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

ls | grep '^Dar' | while read line; do rm "$line";done;
Mitms
источник
это единственный, который работал в моем случае.
Марбель
0

Лучшая команда для меня это:

find ./Daruchini* -exec rm {}\;
Bodale
источник