Команда ls | grep показывает только каталоги (хотя должна также показывать файлы)

Команда ls | grep показывает только каталоги (хотя должна также показывать файлы)

В Linux у меня есть files, содержащий, среди прочего, множество файлов и каталогов, содержащих буквальное "scrap". Я могу увидеть их, набрав ls *scrap*без проблем. Однако это возвращает также каталоги, содержащие буквальное "scrap", и я хотел бы исключить их.

Я пробовал поиграться с ls | grep ".*scrap.*"или , ls | grep scrapно это возвращает только каталоги (а не обычные файлы).

Почему это так?

Следующим шагом будет (после того, как представитель вернет правильный вывод) удаление каталогов из этого вывода. Предложения о том, как это сделать, также приветствуются!

решение1

На самом деле, чтобы в конечном итоге вывести список всех обычных файлов в текущем каталоге (на 1-м уровне), в именах которых есть + scrap, вам не нужен .lsgrep

Со старым добрымfindкоманда:

find . -maxdepth 1 -type f -name "*scrap*" -ls

решение2

Вы сталкиваетесь с проблемами, lsкогда grepимена файлов содержат пробелы или (что еще хуже) символы новой строки. Но с безопасными именами файлов вы можете сделать это:

ls -l | grep -oP '^-.* \K.*$'
ls -l | sed -n '/^-/s/^.* //p'

Но обычно следует использовать именно этот findподход.

решение3

Для имен файлов, не являющихся каталогами, в текущем каталоге, которые содержат scrap, в zsh:

print -rC1 -- *scrap*(ND^/)

Обратите внимание, что в ls *scrap*(или, что более правильно ls -- *scrap*), если какой-либо из *scrap*файлов имеет типкаталог, затем lsперечислит ихсодержаниеthat-scrap-dir:заголовком, если только *scrap*он не расширяется до одного и только одного файла, который находится в этом каталоге).

Если вы хотите, чтобы это было для файлов типакаталог, lsпросто выводит их имя, как и для других типов файлов, вам нужно добавить опцию -d:

ls -d -- *scap*(D^/)

Но вряд ли есть смысл использовать его, lsпоскольку вся работа по поиску файлов по имени и типу уже выполнена оболочкой к моменту lsее вызова, поэтому вы можете воспользоваться встроенной функцией printили printfфункцией вашей оболочки.

решение4

Похоже наэтотэто ответ, который вы ищете. В посте говорится о том, что расширение мира является причиной того, что отображаются только определенные вещи.

Связанный контент