ls
Может дать результат , как
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls
CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo
Но на самом деле я надеюсь просто узнать CentOS-Base.repo
,CentOS-Debuginfo.repo
и CentOS-Vault.repo
нет CentOS-Media.repo
. Поэтому я запускаю эту команду
ls [^\(Media\)]
Но я получаю информацию об ошибке. Как мне поступить?
Ответы:
В самом простом случае вы можете использовать следующее (в случае, если 1-е подслово является статическим
CentOS
):[BDV]
- класс символов, обеспечивающий второе подслово, начинающееся с одного из указанных символовили то же самое с отрицанием :
Если вы хотите игнорировать все имена файлов, которые содержат
M
символ, с реализацией GNUls
(как это обычно бывает в CentOS), используйте параметр-I
(--ignore
):Чтобы игнорировать записи со
Media
словом:Эти шаблоны должны быть переданы дословно
ls
, поэтому должны быть заключены в кавычки (в противном случае оболочка будет рассматривать их как глобусы для расширения).источник
ls *[^M]*
?ls CentOS-[^M]*
Работа, ноls *[^M]*
нет ..M
вхождение символа ИЛИMedia
слово?M
.В некоторых оболочках есть операторы сглаживания отрицания:
zsh -o extendedglob
:ksh
,zsh -o kshglob
,bash -O extglob
:bash
:ksh
:источник
Одним из вариантов является использование
find
с-not -name
флагами. То естьfind . -not -name CentOS-Media.repo
. Если вы не хотите использовать структуру каталогов, добавьте-maxdepth 1
флаг.Кроме того, можно написать следующее (что гораздо сложнее, но я забыл о
-not
флаге и опубликовал этот ответ изначально, поэтому я не буду удалять эту часть):find . -print0 | grep --invert-match -z "CentOS-Media.repo$" | tr '\0' '\n'
Вам нужно принудительно
find
разделять имена файлов нулевым байтом, чтобы новые строки в именах файлов ничего не ломали. Надеюсь,grep
поддерживает этот вид разделителя с флагом-z
. Вы можете вернуться к типичному разделению (т. Е. Нулевой байт -> новая строка) с помощьюtr '\0' '\n'
источник
printf '%s\0' *
которыми не происходит повторение и по умолчанию не включаются точечные файлы (но некоторые оболочки имеют опцию для этого). Вы также не нуждаетесь-E
в этом регулярном выражении, но чтобы быть разборчивым, вы должны либо.
поставить обратную косую черту, либо вставить ее[]
, и вы зависите от GNU find и grep.Самый простой способ - использовать find. Делать:
Здесь «е» означает поиск обычных файлов только ( за исключением символических ссылок на обычных файлов , хотя, с GNU
find
, использование-xtype f
вместо того, чтобы включить их). Если вы хотите искать каталоги, вместо этого введите «d».(
-maxdepth
Хотя изначально расширение GNU сейчас довольно распространено. Еслиfind
оно не поддерживается, его можно заменить-maxdepth 1
стандартным! -name . -prune
).см. справочную страницу поиска для более удивительных функций.
источник