Трубка (|
) соединяет стандартный поток вывода процесса со стандартным потоком ввода другого процесса. Вы не можете использовать это, чтобы передать список имен файлов в г.м.
напрямую, потому что г.м.
не читает имена файлов со своего стандартного ввода.
Ты мог использовать 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 предикат, но здесь это не требуется).
Смотрите также Почему нет разобрать лс
(и что делать вместо этого)?