Lo intenté ls /etc/[ac]*
pero muestra directorios que comienzan con a o c , y todo su contenido, no los archivos que comienzan con " a " o " c ".
Para evitar enumerar el contenido de los directorios, puede:
ls -d /etc/[ac]*
Eso enumerará los nombres de directorio junto con los nombres de archivos comunes que comienzan con a
o c
.
Para completar, una solución que no involucra find
puede ser:
ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9
ls -d
pareció apropiada, pero parece que la pregunta original especifica que no deberían aparecer directorios, independientemente de la expansión o no expansión.
ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9
no analizar ls
.
ls
es un juego justo en mi opinión.
/etc
es muy probable que los nombres sean sanos, un espacio simple interrumpirá el ls
enfoque ya que los números de campo cambiarán. +1 por ls -ld
aunque.
LC_ALL=C
), no se garantiza que la fecha tenga 3 campos en otras configuraciones regionales.
Recursivamente:
find /etc -type f -name '[ac]*'
Si necesita no recurrencia, puede hacerlo de forma portátil:
find /etc/. ! -name . -prune -type f -name '[ac]*'
O esto, de forma no portátil (GNU o un hallazgo reciente de BSD):
find /etc -type f -maxdepth 1 -name '[ac]*'
Si desea hacer este caso insensiblemente, use en -iname
lugar de -name
.
-type f
es para archivos normales . Si, en cambio, necesita archivos que no sean de directorio, reemplácelos con ! -type d
(o ! -xtype d
con GNU find
si también desea excluir enlaces simbólicos a directorios).
Puedes probar este comando también,
for file in /etc/[ac]*; do echo $file; done | xargs file | awk -v FS=" +" '$2~/directory/ {next;} {print $1}' | sed 's|\/etc\/||g;s/://g'
Si desea tanto los directores (no el contenido del directorio) como los archivos, puede usar printf
bultin:
printf "%s\n" [ac]*
Ejemplo:
$ printf "%s\n" [te]*
examples.desktop
teamviewer_linux.deb
test.php
test.txt
No recursivo sin find
:
ls -pd /etc/[ac]* | grep -v '/$'
la -p
añade una /
al final de directorios, que la grep
filtra a cabo. Por supuesto, no funciona para nombres de archivo que contienen caracteres especiales como líneas nuevas.
Con zsh
:
print -rl /etc/[ac]*(.)
Enumeraría los archivos normales (como -type f
en find
) enumerados en /etc
cuyo nombre comienza con a
o c
. La (xxx)
parte al final de un glob es una característica específica de zsh llamada calificador globbing. .
como calificador global significa archivo regular .
Si el glob no coincide, zsh
abortará el comando. Tenga en cuenta que en otros shells tipo Bourne, si el glob no coincide, el patrón se expande a sí mismo, por lo que ls -d /etc/[ac]*
podría enumerar incorrectamente un archivo llamado /etc/[ac]*
si no hay un archivo que comience por a
o c
dentro /etc
.
print -rl /etc/[ac]*(^/)
enumeraría los archivos que no son de tipo directorio y
print -rl /etc/[ac]*(-^/)
enumeraría los archivos que no son de tipo directorio después de resolver enlaces simbólicos.
Para mostrar archivos que comienzan con:
ls etc | grep ^a
Para mostrar archivos que comienzan con c:
ls etc | grep ^c
ls -d /etc/[ac]*
que no obtendría el contenido de los directorios coincidentes, pero aún vería los nombres de los directorios. No está claro si esto es lo que desea o si desea evitar incluso enumerar los nombres de directorio.