it-swarm-ru.tech

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

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

ls | grep '^\[Daruchini'| rm

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

50
CodeBladeRunner

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

$ ls | grep '^Dar' | xargs rm

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

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

)

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

$ rm Dar*

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

61
geekosaur

Не анализировать выходные данные ls .

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

rm Dar*

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

5
Gilles 'SO- stop being evil'

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

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

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

3
mherzl

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

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

На Catalina 10.15.3, с zsh, я нашел способ справиться с символами новой строки и пробелами:

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

Другими словами, путем перевода новых строк без пробелов (от tr\n до\0) перед удалением с помощью "rm -0".

Кроме того, я всегда использую 'find' + 'grep -i', потому что 'find -iname' иногда ничего не выводит.

Последнее замечание: он находит и удаляет файлы и папки, которые соответствуют 'yourString'. Только для файлов, укажите "find -type f", и тогда опция "-r" для rm бесполезна.

0
YvUh

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

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