Cómo encontrar todos los archivos excepto un archivo especificado

13

El lspuede 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.repoy CentOS-Vault.repono CentOS-Media.repo. Entonces ejecuto este comando

ls [^\(Media\)]

Pero recibo información de error. ¿Cómo debo hacer?

yode
fuente
Relacionado: Excluir un patrón del partido
global
@steeldriver Gracias por tu enlace, eso es muy útil para mí ..
yode
Se podría considerar cambiar su shell a zsh , que tiene un borrado del dibujo, instalación
Basile Starynkevitch

Respuestas:

10

En el caso más simple, puede usar lo siguiente (en caso de que la primera subpalabra sea estática CentOS):

ls CentOS-[BDV]*

  • [BDV] - clase de caracteres para garantizar que la segunda subpalabra comience con uno de los caracteres especificados

o lo mismo con la negación :

ls CentOS-[^M]*

Si desea ignorar todos los nombres de archivo que contienen el Mcarácter, con la implementación de GNU de ls(como se encuentra típicamente en CentOS), use la opción -I( --ignore):

ls -I '*M*'

-I, --ignore = PATTERN
no enumera las entradas implícitas que coinciden con el shell PATTERN

Para ignorar entradas con Mediapalabra:

ls -I '*Media*'

Esos patrones deben pasarse literalmente ls, por lo que deben citarse (de lo contrario, el shell los trataría como globos para expandirse).

RomanPerekhrest
fuente
Por qué no podemos usar ls *[^M]*
yode
El ls CentOS-[^M]*trabajo, pero el ls *[^M]*no ..
yode
@yode, depende de qué es exactamente lo que quiere ignorar: ¿ MOcurrencia de caracteres O Mediapalabra?
RomanPerekhrest
Pero en mi caso, solo ese archivo tiene un carácter M.
yode
3
Los patrones son codiciosos: el primer * coincide con todo excepto la última letra, el [^ M] coincide con la última letra ya que ninguno de ellos termina con M y el final * coincide con la cadena vacía. Entonces todos coinciden. E incluso si algo terminara con M, coincidiría, suponiendo que hubiera algo diferente de M en algún lugar: por ejemplo, si tuviera un archivo llamado OOM, la primera estrella coincidiría con la primera O, la [^ M] coincidiría con la segunda O y el comienzo final coincidiría con la M.
NickD
12

Algunos proyectiles tienen operadores de negación:

  • zsh -o extendedglob:

    ls -d -- ^*Media*
    ls -d -- *.repo~*Media* # ~ is "except" operator
    
  • ksh, zsh -o kshglob, bash -O extglob:

    ls -d -- !(*Media*)
    
  • bash:

    GLOBIGNORE='*Media*'
    ls -d -- *
    
  • ksh:

    FIGNORE='@(*Media|.)*'
    ls -d -- *
    
Stéphane Chazelas
fuente
6

Una opción es usar findcon las -not -name banderas. Es decir find . -not -name CentOS-Media.repo. Si no desea recurrir a la estructura del directorio, agregue la -maxdepth 1bandera.

Alternativamente, uno puede escribir lo siguiente (que es mucho más complejo, pero olvidé la -notmarca y publiqué esta respuesta originalmente, por lo que no eliminaré esta parte):

find . -print0 | grep --invert-match -z "CentOS-Media.repo$" | tr '\0' '\n'

findDebe 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, grepadmite 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'

mosca de espuma de poliestireno
fuente
1
También puede obtener nombres de archivo separados por nulos con los 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 -Epara 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.
dave_thompson_085
4

La forma más fácil es usar find. Hacer:

find . -maxdepth 1 -type f ! -name "CentOS-Media.repo"

Aquí "f" significa buscar solo archivos regulares (sin embargo, excluye enlaces simbólicos a archivos regulares; con GNU find, use -xtype fen su lugar para incluirlos). Si desea buscar directorios, pase "d" en su lugar.

( -maxdepthmientras que inicialmente una extensión GNU ahora es bastante común. Si findno la admite, puede reemplazarla -maxdepth 1con el estándar ! -name . -prune).

consulte la página de búsqueda de man para obtener más funciones increíbles.

Al 123
fuente