Cómo enumerar archivos que comienzan con "a" o "c" de / etc. [cerrado]

10

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 ".

3df
fuente
Los directorios son uno de los muchos tipos de archivos . ¿En qué tipos de archivos está interesado (regular, enlace simbólico, dispositivo, tubería, socket ...)?
Stéphane Chazelas
No está claro si usted por "directorio" está hablando del contenido de los directorios o de los nombres de los directorios. El comando que muestra enumeraría el contenido de los directorios que coinciden con el patrón, con el 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.
Kusalananda

Respuestas:

23

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 ao c.

Para completar, una solución que no involucra findpuede ser:

ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9
Greg Hewgill
fuente
Mi lectura inicial de la pregunta también me ls -dpareció apropiada, pero parece que la pregunta original especifica que no deberían aparecer directorios, independientemente de la expansión o no expansión.
Chris Down
1
ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9no analizar ls.
Avinash Raj
1
@AvinashRaj: Bueno, la relevancia de ese consejo depende de si uno necesita esta solución para funcionar una vez o para siempre. Si solo una vez, el análisis lses un juego justo en mi opinión.
Greg Hewgill
3
Él tiene un punto. Si bien /etces muy probable que los nombres sean sanos, un espacio simple interrumpirá el lsenfoque ya que los números de campo cambiarán. +1 por ls -ldaunque.
terdon
1
También debe corregir la configuración regional ( LC_ALL=C), no se garantiza que la fecha tenga 3 campos en otras configuraciones regionales.
Stéphane Chazelas
7

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 -inamelugar de -name.

Chris Down
fuente
1
Tenga en cuenta que -type fes para archivos normales . Si, en cambio, necesita archivos que no sean de directorio, reemplácelos con ! -type d(o ! -xtype dcon GNU findsi también desea excluir enlaces simbólicos a directorios).
Stéphane Chazelas
1

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'
Avinash Raj
fuente
1

Si desea tanto los directores (no el contenido del directorio) como los archivos, puede usar printfbultin:

printf "%s\n" [ac]*

Ejemplo:

$ printf "%s\n" [te]*
examples.desktop
teamviewer_linux.deb
test.php
test.txt
Cuonglm
fuente
¿Cómo evitará esto directorios, como se solicita en la pregunta?
Chris Down
Oh, mi mala lectura. Creo que OP quiere directorio pero no su contenido.
Cuonglm
Perdón por la edición, completamente mal leída.
terdon
1

No recursivo sin find:

ls -pd /etc/[ac]* | grep -v '/$'

la -pañade una /al final de directorios, que la grepfiltra a cabo. Por supuesto, no funciona para nombres de archivo que contienen caracteres especiales como líneas nuevas.

Anthon
fuente
1

Con zsh:

print -rl /etc/[ac]*(.)

Enumeraría los archivos normales (como -type fen find) enumerados en /etccuyo nombre comienza con ao 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, zshabortará 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 ao cdentro /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.

Stéphane Chazelas
fuente
-3

Para mostrar archivos que comienzan con:

ls etc |  grep ^a

Para mostrar archivos que comienzan con c:

ls etc |  grep ^c
Raj
fuente