O ls
pode dar um resultado como
[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
Mas realmente espero apenas descobrir CentOS-Base.repo
, CentOS-Debuginfo.repo
e CentOS-Vault.repo
, mas não CentOS-Media.repo
. Então eu executo este comando
ls [^\(Media\)]
Mas recebo uma informação de erro.
Respostas:
No caso mais simples, você pode usar o seguinte (no caso, se a primeira subpalavra for estática
CentOS
):[BDV]
- classe de caractere para garantir a segunda subpalavra começando com um dos caracteres especificadosou o mesmo com negação :
Se você deseja ignorar todos os nomes de arquivos que contêm o
M
caractere, com a implementação GNU dels
(como normalmente encontrada no CentOS), use a opção-I
(--ignore
):Para ignorar entradas com a
Media
palavra:Esses padrões precisam ser passados literalmente para
ls
, portanto, devem ser citados (caso contrário, o shell os trataria como globs para expandir).fonte
ls *[^M]*
?ls CentOS-[^M]*
trabalho, mas als *[^M]*
não ..M
ocorrência de caracteres OUMedia
palavra?M
.Alguns shells possuem operadores de globbing de negação:
zsh -o extendedglob
:ksh
,zsh -o kshglob
,bash -O extglob
:bash
:ksh
:fonte
Uma opção é usar
find
com os-not -name
sinalizadores. Ou sejafind . -not -name CentOS-Media.repo
. Se você não deseja recuar na estrutura de diretórios, adicione-maxdepth 1
sinalizador.Como alternativa, pode-se escrever o seguinte (que é muito mais complexo, mas eu esqueci a
-not
sinalização e postei esta resposta originalmente, por isso não excluirei esta parte):find . -print0 | grep --invert-match -z "CentOS-Media.repo$" | tr '\0' '\n'
Você precisa forçar
find
a separação de nomes de arquivos com byte nulo, para que as novas linhas nos nomes de arquivos não avaliem nada. Felizmente,grep
suporta esse tipo de separador com sinalizador-z
. Você pode querer reverter para a separação típica (ou seja, byte nulo -> nova linha) comtr '\0' '\n'
fonte
printf '%s\0' *
quais não se repete e não inclui arquivos de ponto por padrão (mas alguns shells têm uma opção para isso). Você também não precisa-E
para que regexp, mas para ser exigente você deve ou barra invertida a.
ou colocá-lo em[]
, e você faz depender GNU encontrar e grep.A maneira mais fácil é usar o find. Faz:
Aqui "f" significa procurar apenas arquivos regulares (embora exclua links simbólicos para arquivos regulares; no GNU
find
, use-xtype f
para incluí-los). Se você deseja procurar por diretórios, passe "d".(
-maxdepth
embora inicialmente uma extensão GNU agora seja bastante comum. Se o seufind
não suportar, você poderá substituí-maxdepth 1
-lo pelo padrão! -name . -prune
).consulte a página do manual find para obter mais recursos impressionantes.
fonte