![Buscar directorios excluyendo el corchete final ')'](https://rvso.com/image/83705/Buscar%20directorios%20excluyendo%20el%20corchete%20final%20')'.png)
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 ls
no 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
, b
o c
;
[^abc]
coincide con cualquier cosa excepto a
, b
o 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 GLOBIGNORE
valor.
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 foo
obtendrás foo/
.