El ls
puede dar un 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
Pero en realidad espero descubrirlo CentOS-Base.repo
, CentOS-Debuginfo.repo
y CentOS-Vault.repo
no CentOS-Media.repo
. Entonces ejecuto este comando
ls [^\(Media\)]
Pero recibo información de error. ¿Cómo debo hacer?
Respuestas:
En el caso más simple, puede usar lo siguiente (en caso de que la primera subpalabra sea estática
CentOS
):[BDV]
- clase de caracteres para garantizar que la segunda subpalabra comience con uno de los caracteres especificadoso lo mismo con la negación :
Si desea ignorar todos los nombres de archivo que contienen el
M
carácter, con la implementación de GNU dels
(como se encuentra típicamente en CentOS), use la opción-I
(--ignore
):Para ignorar entradas con
Media
palabra:Esos patrones deben pasarse literalmente
ls
, por lo que deben citarse (de lo contrario, el shell los trataría como globos para expandirse).fuente
ls *[^M]*
?ls CentOS-[^M]*
trabajo, pero ells *[^M]*
no ..M
Ocurrencia de caracteres OMedia
palabra?M
.Algunos proyectiles tienen operadores de negación:
zsh -o extendedglob
:ksh
,zsh -o kshglob
,bash -O extglob
:bash
:ksh
:fuente
Una opción es usar
find
con las-not -name
banderas. Es decirfind . -not -name CentOS-Media.repo
. Si no desea recurrir a la estructura del directorio, agregue la-maxdepth 1
bandera.Alternativamente, uno puede escribir lo siguiente (que es mucho más complejo, pero olvidé la
-not
marca y publiqué esta respuesta originalmente, por lo que no eliminaré esta parte):find . -print0 | grep --invert-match -z "CentOS-Media.repo$" | tr '\0' '\n'
find
Debe forzar la separación de los nombres de archivo con un byte nulo, para que las nuevas líneas en los nombres de archivo no descompongan nada. Con suerte,grep
admite este tipo de separador con bandera-z
. Es posible que desee volver a la separación típica (es decir, byte nulo -> nueva línea) contr '\0' '\n'
fuente
printf '%s\0' *
que no se repiten y no incluyen archivos de puntos por defecto (pero algunos shells tienen una opción para eso). También no es necesario-E
para que la expresión regular, pero para ser exigente que debe barra invertida o bien el.
o ponerlo en[]
, y lo hace depender de GNU encontrar y grep.La forma más fácil es usar find. Hacer:
Aquí "f" significa buscar solo archivos regulares (sin embargo, excluye enlaces simbólicos a archivos regulares; con GNU
find
, use-xtype f
en su lugar para incluirlos). Si desea buscar directorios, pase "d" en su lugar.(
-maxdepth
mientras que inicialmente una extensión GNU ahora es bastante común. Sifind
no la admite, puede reemplazarla-maxdepth 1
con el estándar! -name . -prune
).consulte la página de búsqueda de man para obtener más funciones increíbles.
fuente