Рейтинг:0

ls, чтобы (большие воздушные кавычки) «связать» их с помощью grep, а затем rm все найденные совпадения в одной команде ... Это достижимо?

флаг in

Простая проблема, но мне не хватает командных каналов bash, чтобы полностью реализовать свои стремления. Я надеялся найти, если не команду, которую я ищу, то, возможно, где она находится, я мог бы освежить в памяти литературу, чтобы выполнить свою задачу. Вот моя проблема + то, что я пробовал до сих пор: Итак, у меня есть подержанный жесткий диск, и есть некоторые (не сомневайтесь) аномалии, оставленные позади с их именем в качестве имени файла, которые делают невозможным реализовать это как теперь мой жесткий диск. Мне удалось получить доступ к корневой точке монтирования и найти файлы, которые я хочу удалить, с помощью ''' ls -A | grep abcdef ''' есть ли способ передать список grep'd команде '''rm -f''' после этого, потому что, когда я пытаюсь '''ls -A | grep abcdef | rm''' это не совсем сработало. После этого огромного провала (что именно вы берете?!) я попробовал ''' ls -A | grep abcdef <| rm ''' плюс много других итераций подобного стока, но безрезультатно. Опять же, мне не обязательно нужен «простой ответ», но, возможно, точное место, где я могу получить некоторую конечную помощь в перенаправлении вывода, было бы здорово. (Отвечал ли я сам себе? Будет ли удаление его в /dev/null после этого делать то, что мне нужно?...Я попробую это, но, надеюсь, не помешает попросить помощи в перенаправлении команд) Любая помощь будет очень признательна, спасибо.

vanadium avatar
флаг cn
Старайтесь быть менее многословным и более точным. Четко обозначьте, в чем заключается ваша «задача», т. е. какова ваша конечная цель. Рассмотрите возможность использования форматирования кода, чтобы отличить код терминала от текста, что также поможет улучшить читаемость. Четкие, читаемые вопросы с большей вероятностью приведут к четким, читаемым ответам.
guiverc avatar
флаг cn
Я бы написал `find`, который находит нужные вам файлы, а затем просто добавил бы к этой команде опцию `-delete` (т. е. пусть ваш отработанный `find` удалит найденные файлы); но это не использование трубопровода, как вы просите.
флаг hr
Похоже, вы ищете `xargs`... однако, как заметил @guiverc, `find` обычно предпочтительнее, чем `ls` + `grep` + (xargs) `rm`
Jake Baldwin avatar
флаг in
@vanadium - я думал, что да. Я использую сотовое устройство, чтобы сделать этот пост, и в нижней части поля описания было показано, как это сделать, поэтому я решил, что это просто не отображается в моем поле ввода. У меня есть некоторые результаты команды grep'd "ls", которые я хотел, чтобы они были rm'd, а не отображались в длинном списке.
Jake Baldwin avatar
флаг in
@guiverc - я бы просто «нашел» их, но мне нужны были все файлы с определенным именем где-либо в них, поэтому я «ls -AR | grep abc» был лучшим, к чему я мог прийти. Если есть лучший способ с «найти», пожалуйста, покажите мне. (Без сарказма)
Jake Baldwin avatar
флаг in
@steeldriver - я посмотрю на это. xargs.... Мне придется прочитать справочную страницу, всем спасибо.
guiverc avatar
флаг cn
`find` - это команда, которая позволяет использовать регулярное выражение, как то, что вы используете (и гораздо более сложное)... т.е. с помощью предложения `-name`. Одна хорошая вещь с *unix* (posix или GNU/Linux) заключается в том, что есть много способов сделать что угодно. Я думаю, это была точка @vanadium; расскажите нам, чего вы хотите достичь, и, возможно, вы получите много результатов, которые достигают того, чего вы хотите (`find -name '*paper*'` найдет имена файлов/папок, содержащих слово paper (где угодно)... включая поиск в подкаталогах ниже вашего текущего $PWD... добавление `-delete` к этому приведет к удалению этих файлов/папок
Рейтинг:2
флаг hr

Трубка (|) соединяет стандартный поток вывода процесса со стандартным потоком ввода другого процесса. Вы не можете использовать это, чтобы передать список имен файлов в г.м. напрямую, потому что г.м. не читает имена файлов со своего стандартного ввода.

Ты мог использовать xargs программа для чтения списка это стандартный ввод и «объединить» имена файлов для г.м.:

лс-А | grep abcdef | xargs пм

но не, с этим подходом связаны всевозможные проблемы, в частности, grep обрабатывает ввод построчно, а xargs по умолчанию разбивает входные данные на пробелы. Вы можете сделать это лучше, используя что-то вроде

shopt -s dotglob # имитировать ls -A "почти все" скрытые файлы
printf '%s\0' * | grep -z abcdef | xargs -0 пм

который использует нулевой символ ASCII для однозначного разделения имен файлов. Обычно предпочтительным подходом является использование найти команда:

найти . -maxdepth 1 -name '*abcdef*' # -delete

(я оставил -удалять прокомментировал на данный момент - убедитесь, что это найтипроверяя нужные файлы, прежде чем раскомментировать их, так как нет операции «отменить»).

Обратите внимание, что найти рекурсивно в подкаталоги по умолчанию - если вы хотите эквивалент лс-р затем удалите -максимальная глубина 1. Можете добавить -тип ф для поиска и удаления только файлов (без каталогов).

Также обратите внимание, что найти -имя использует шаблоны оболочки оболочки, а не регулярные выражения, используемые grep (у него также есть -regex match предикат, но здесь это не требуется).

Смотрите также Почему нет разобрать лс (и что делать вместо этого)?

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.