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

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

0
задан 16 August 2021 в 13:26

1 ответ

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

Вы можете использовать программу xargs для чтения списка на его стандартном вводе и «связать» имена файлов для rm :

ls -A | grep abcdef | xargs rm

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

shopt -s dotglob # simulate ls -A "almost all" hidden files
printf '%s\0' * | grep -z abcdef | xargs -0 rm

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

find . -maxdepth 1 -name '*abcdef*' # -delete

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

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

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

См. Также Почему не parse ls (и что делать вместо этого)?

2
ответ дан 20 August 2021 в 10:26

Другие вопросы по тегам:

Похожие вопросы: