Puedo usar ls -ld */
para enumerar todas las entradas del directorio en el directorio actual. ¿Existe una manera igualmente fácil de enumerar todos los archivos normales en el directorio actual? Sé que puedo usar find
find . -maxdepth 1 -type f
o stat
stat -c "%F %n" * | grep "regular file" | cut -d' ' -f 3-
pero esto no me parece demasiado elegante. ¿Hay una manera breve y agradable de enumerar solo los archivos normales (no me interesan los dispositivos, las tuberías, etc.) pero no los subdirectorios del directorio actual? Enumerar enlaces simbólicos también sería una ventaja, pero no es una necesidad.
find
comando es la mejor manera de hacer lo que quieres. ¡Para algunas otras opciones confiables, debe buscar comandos específicos de shell (y esos son cualquier cosa menos portátiles)!ls -d */
, que es corto, fácil de escribir y fácil de entender. Así que estoy bastante contento con la respuesta de Ulrich Dangel, aunque no estoy usando zsh.Respuestas:
Con
zsh
y Glob Qualifiers puede expresarlo fácilmente directamente, por ejemplo:solo devolverá la lista de archivos normales o un error dependiendo de su configuración.
Para los no directorios:
(incluirá enlaces simbólicos (incluidos los directorios), tuberías con nombre, dispositivos, enchufes, puertas ...)
para archivos regulares y enlaces simbólicos a archivos regulares.
para no directorios y tampoco enlaces simbólicos a directorios.
Además, vea el
D
calificador global si desea incluir archivos D ot (archivos ocultos), como*(D-.)
.fuente
Este comando enumera todos los archivos no ocultos que no son directorios (archivos normales, enlaces, archivos de dispositivo , etc.). Para incluir también archivos ocultos, agregue la
-A
opción als
Se supone que ninguno de los archivos tiene caracteres de nueva línea en su nombre. Agregar una
-q
opción als
transformaría todos los caracteres no imprimibles, incluida la nueva línea?
, para garantizar que estén en una línea y sean tan adecuados para alimentar a una utilidad basada en líneas comogrep
e imprimir en una terminal.fuente
--color=always
als
, para OSX-G
.sudo chmod 777
al final, y recibí errores ... Cualquier ayuda es muy apreciadals -pL | grep -v /
. Los-L
enlaces simbólicos de desreferencia añadidos .ls -pdL something* | grep -v /
. La-d
opción agregada enumera los directorios, no sus contenidos, por lo que se excluirán correctamente.Para enumerar solo archivos normales:
Con enlaces simbólicos (a cualquier tipo de archivo) incluidos:
Donde el primer carácter de la lista describe el tipo de archivo,
-
significa que es un archivo normal, ya que el enlace simbólico esl
.Debian / Ubuntu
Imprima los nombres de todos los archivos coincidentes (incluidos los enlaces):
Con caminos absolutos:
Imprima los nombres de todos los archivos
/etc
que comienzan conp
y terminan cond
:fuente
ls
no tiene ninguna opción para hacer eso, pero una de las cosas buenas de unix y linux es que las tuberías largas y poco elegantes pueden convertirse fácilmente en un script, función o alias de shell. y estos, a su vez, pueden usarse en tuberías como cualquier otro programa.(NOTA: existen algunos problemas de alcance con las funciones y los alias. Los scripts están disponibles para cualquier ejecutable que pueda leerlos y ejecutarlos. Los alias y las funciones solo están disponibles en el shell actual, aunque el .profile / .bashrc, etc. de un sub-shell puede redefinir y así ponerlos a disposición. Además, se puede escribir un script en cualquier idioma, incluidos bash / sh, awk, perl, python y otros, el que sea mejor para el trabajo o con el que esté más familiarizado)
p.ej
alias lsf='find . -maxdepth 1 -type f -print0 | xargs -0r ls'
He agregado xargs para que pueda usar todas las
ls
opciones habituales , p. Ej.lsf -lrS
Debido a que usa
find
, se mostrarán todos los archivos de puntos normalmente ocultos, y todos los nombres de archivo tendrán el prefijo ./, esa es la única diferencia que notará.Podría excluir archivos de puntos con,
! -iname '.*'
pero luego tendría que tener dos versiones del alias: una que mostrara archivos de puntos y otra que no.alias lsf2='find . -maxdepth 1 -type f -a ! -iname '\''.*'\'' -print0 | xargs -0r ls'
Alternativamente, si
lsf
fuera un script en lugar de un alias, podría analizar las opciones (tal vez con getopts o / usr / bin / getopt o similar), y excluir los archivos de puntos a menos que-a
estuvieran presentes.fuente
-name
es suficiente, no necesitas-iname
.La opción -F para ls agrega * a ejecutables, / a directorios, @ a enlaces simbólicos, = a sockets y | a FIFOs. Luego puede usar grep para excluir los caracteres de archivo no regulares de la salida y usted tiene los archivos. Esto funcionará en cualquier shell, no solo en zsh.
Las debilidades son:
@
,=
o|
será excluido (pero que en realidad no debería tener archivos con esos caracteres en el nombre de todos modos)fuente
=
,@
o|
caracteres.=
es común en nombres de archivos o maildir que tienen una base codificada imprimible con base64 o entre comillas.@
en definiciones locales, para direcciones de correo electrónico y más. Sin embargo, es raro que aparezcan al final del nombre del archivo. (solo 31 de 2.2 millones en este sistema, por ejemplo)El manual establece que la opción 'f' está solo en contra de 'archivo normal', no en tuberías, zócalos o dispositivos block / char, lo que significa que ya está haciendo lo correcto.
fuente
Esto no es particularmente corto, pero puede convertirlo en un script o un alias si necesita llamarlo rápidamente. Usando el comando ls como una matriz de entrada, llame a ls -ld en cada entrada canalizada a grep para excluir directorios con la salida enviada a nulo, y si tiene éxito, repita la entrada original:
Puede invertir el grep y la salida condicional, los mismos resultados:
fuente
\dev\null
?!?!Este es un hilo un poco viejo, pero la forma más limpia de listar solo archivos.
fuente
touch "some file name"
para ver un contraejemplo rápidols -al | grep '^-' | awk '{ for(i=9; i<=NF; ++i) printf $i""FS; print "" }'
, debe manejar los archivos con espacios en ellos.