Tengo un directorio llamado uploads
. Contiene un montón de archivos, además de algunos subdirectorios que a su vez contienen archivos.
¿Hay alguna manera de que pueda (en un solo paso) hacer lo siguiente:
Enumere SOLAMENTE los archivos en el directorio de cargas raíz: no quiero ver los nombres de las subcarpetas ni sus contenidos;
y
NO enumere ningún archivo que comience con
t_
Sé acerca de la -d
bandera, pero no me da lo que quiero.
-exec ls -lG -- {} +
en su respuesta para obtener la salida usando opciones adicionales para ls. También puede agregar solo un-ls
a este hallazgo para obtener una aproximación rápida y sucia de la vista detallada de ls.GNU ls (es decir, el comando ls en sistemas Linux no integrados y Cygwin, también disponible en algunos otros dispositivos) tiene una opción para ocultar algunos archivos, en función de sus nombres. Sin embargo, no hay forma de ignorar los directorios.
Otro enfoque es hacer que su shell haga la correspondencia. Bash, ksh y zsh tienen un patrón de negación
!(t_*)
para que coincida con todos los archivos, excepto los que coincident*
; en bash, esta característica debeshopt -s extglob
activarse y en zsh debe activarse consetopt ksh_glob
. Zsh también tiene la sintaxis equivalente con la^t_*
que debe activarsesetopt extended_glob
. Esto todavía no ignora los directorios. Zsh tiene una característica adicional que permite hacer coincidir archivos no solo por nombre sino también por metadatos y más: calificadores globales . Agregue(.)
al final de una coincidencia para restringir a los archivos normales. La negación^
es parte de la sintaxis de coincidencia de nombres, por lo que^t_*(.)
significa "todos los archivos normales no coincident_*
" y no "todos los archivos que no coinciden con los archivos normalest_*
".Si te encuentras sin herramientas avanzadas, puedes hacerlo en cualquier Unix con
find
. No es el tipo de cosa que normalmente escribiría en la línea de comando, pero es potente y preciso. Caleb ya ha mostrado cómo hacer esto con GNU find . La-maxdepth
opción no es portátil; puede usar-prune
en su lugar, para evitar que se repitafind
de forma portátil.Reemplace
-print
por-exec ls -lG -- {} +
para ejecutarls
con sus opciones favoritas en los archivos.Todos los comandos anteriores ocultan archivos de puntos (es decir, archivos cuyo nombre comienza con a
.
). Si desea mostrar ellos, pasar-A
als
, o añadir elD
calificativo pegote en zsh (ls uploads/^t_*(.D)
). Confind
, puede usar un enfoque diferente para hacer que se repita solo un nivel (find
no trata los archivos de puntos especialmente). Esto solo funciona completamente si se ejecutafind
en el directorio actual.fuente
-maxdepth
debería funcionar, pero el problema de "portabilidad" al que se refiere Gilles es que el BSDfind
(también se encuentra en OSX, creo) es un animal un poco diferente, por lo que es posible que necesite su respuesta también. @Gilles: ¡+1 para el truco zsh!prune
vienen a la mente algunos comentarios no tan jugosos acerca de s, pero lo dejaré pasar simplemente diciendo que cuando estoy hurgando en mis propios sistemas la cantidad de veces que el pensamiento "funcionaría este comando si estuviera encendido AIX, Solaris o MINIX3 "es aproximadamente ... en espera ... Me está costando mucho leer el medidor ... la pantalla está congelada0.00
.ls
tiene Gnu una--use-telepathy
opción? Esa es la forma más rápida de mostrar solo los archivos que desea. Sin embargo, puede que no sea portátil.fuente
$9
en esta declaración?ls
salida .print
$ NF` sería mejor, IMO. $ NF significa número de campos, que serían 9 y es un uso común en AWK como una buena oportunidad para enseñar a otros sobre $ NF.fuente
find
?Déjame darle una oportunidad usando
ls
y tuberías:digamos que la última columna es la novena.
fuente
Si el problema de portabilidad -maxdepth de find es un problema, puede usar:
No soy un experto, pero creo que esto debería funcionar. Supongo que parece un poco críptico, pero si hablas mal, en realidad no lo es. $ NF podría usarse en lugar de $ 9. También puedes hacer:
que hace lo mismo (pero quizás menos eficientemente que el anterior ???).
En realidad, después de pensar en las otras publicaciones, parece que
Es una forma aún más corta y clara.
Alguien por favor corrígeme si me equivoco. :-)
fuente
ls
generalmente no es una buena idea . Sus trucos awk fallarán con nombres de archivos con espacios en blanco en ellos, por ejemplo.Encontré estas formas cortas:
o
fuente
Prueba este alias y úsalo:
fuente
ls -hLlF
muestra los subdirectorios y muestra los archivos que comienzan cont_
. Entonces, ¿cómo responde esto a la pregunta?Pan comido:
ls -l --hide 't_*' <absolute path to desired directory> | grep -v ^d
fuente