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