Buscar directorios excluyendo el corchete final ')'

Buscar directorios excluyendo el corchete final ')'

Estoy tratando de enumerar todos los directorios de videos (no archivos) que no terminan en un año, por ejemplo, (2015)y más específicamente los que no tienen un año en la lista, por lo tanto, no terminan en un corchete de cierre ).

¿Cómo puedo hacer lo contrario de lo siguiente?

# List all files and directories end with '(2015)'
ls -ld *\(2015\)

# List all files and directories end with ')'
ls -ld *\)

¿Alguien puede ayudar a explicar cómo hacer esto?

Respuesta1

Prueba esto:

ls -ld *[^\)]

[] - conjunto de caracteres que nos interesan

^ - negación (por lo que incluimos un conjunto de caracteres que no queremos)

\) - escapado ')'

Respuesta2

En bash o zsh:

for i in *; do [ -d "$i" ] && [[ ! "$i" =~ \)$ ]] && printf "%s\n" "$i"; done

Eso simplemente recorrerá todos los archivos y directorios en el directorio actual y verificará que i) sean un directorio ( [ -d "$i" ])y ii) su nombre no termine con )( [[ ! "$i" =~ \)$ ]]. Se imprimirán los elementos que pasen ambas pruebas.

Esto puede tratar con nombres de archivos arbitrarios (que lsno puede).

Respuesta3

Método 1a:

ls -ld -- *[^\)]

(usando el […]patrón de expansión del nombre de ruta (comodín/glob): [abc]coincide con a, bo c; [^abc]coincide con cualquier cosa excepto a, bo c; por lo tanto [^\)]coincide con cualquier cosa excepto ).)

Método 2a:

GLOBIGNORE="*)"
ls -ld -- *

¿Se explica por sí mismo?

Ambos métodos buscarán archivos y otros objetos que no sean directorios.


Actualizado con la sugerencia de don_crissti, para buscar directorios únicamente:

Método 1b:

ls -ld -- *[^\)]/

Método 2b:

GLOBIGNORE="*)/"
ls -ld -- */

Tenga en cuenta que debe incluir el /en el GLOBIGNOREvalor.

Respuesta4

POSIXly:

find . ! -name . -prune -type d ! -name '*)'

Con zsh:

print -rl -- *[^\)](/)

Otros proyectiles tipo Bourne no tienen la capacidad de filtrar resultados globales. Puedes usar:

printf '%s\n' *[!\)]/

para que coincida únicamente con directorios. Pero agregará una barra diagonal al resultado de su expansión. Con directorio fooobtendrás foo/.

información relacionada