Digamos que tengo un directorio con archivos a1, a2, a3, b1, b2, b3. Solo quiero hacer coincidir los archivos que comienzan con apero no contienen 3. Lo intenté ls -I "*3" *a*pero vuelve a1 a2 a3, aunque no quiero que coincida a3. ¿Es esto posible con ls?
12

do not list implied entries matching shell PATTERNsin embargo, no explica qué se entiende por implícito , pero supongo que solo se aplica a los archivos que selsobtienen mediante expansiones globales, ylsno expande ela*, el shell hace eso .Respuestas:
Sólo:
shopt -s extglobactiva el globbing extendido.acoincide con el inicioa!()niega el partido dentro del()...*3*que es3y cualquier cosa antes o después.fuente
set -s extglobLas respuestas existentes indican bien la mejor manera de hacer esto con globs; Incluiré esto porque en la mayoría de los casos,
findes una mejor opción si desea realizar secuencias de comandos o procesamiento adicional:Puede alimentar la respuesta
xargspara acciones fáciles, o unwhile readbucle para cosas más complicadas.fuente
Una manera fácil es
a*3El comando UNIX es
ls -1muestra un archivo por línea.grepnormalmente encuentra líneas que coinciden con un patrón pero con-veste comportamiento se invierte, es decir, grep encuentra líneas que no coinciden con ese patrón.fuente
lsno es una idea tonta: mywiki.wooledge.org/ParsingLsCon
zsh, utilizando el~operador global :Con
gnulsusted podría usar dos--ignoreopciones:el primero ignora todos los nombres de archivo que no comienzan
ay el segundo ignora los nombres de archivo que contienen3fuente