В Linux у меня есть files, содержащий, среди прочего, множество файлов и каталогов, содержащих буквальное "scrap". Я могу увидеть их, набрав ls *scrap*
без проблем. Однако это возвращает также каталоги, содержащие буквальное "scrap", и я хотел бы исключить их.
Я пробовал поиграться с ls | grep ".*scrap.*"
или , ls | grep scrap
но это возвращает только каталоги (а не обычные файлы).
Почему это так?
Следующим шагом будет (после того, как представитель вернет правильный вывод) удаление каталогов из этого вывода. Предложения о том, как это сделать, также приветствуются!
решение1
На самом деле, чтобы в конечном итоге вывести список всех обычных файлов в текущем каталоге (на 1-м уровне), в именах которых есть + scrap
, вам не нужен .ls
grep
Со старым добрым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
Похоже наэтотэто ответ, который вы ищете. В посте говорится о том, что расширение мира является причиной того, что отображаются только определенные вещи.