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


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

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.


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'

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

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


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.


-3

Para mostrar archivos que comienzan con:

ls etc |  grep ^a

Para mostrar archivos que comienzan con c:

ls etc |  grep ^c
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.