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:
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.
@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.
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'
¿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.
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.
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.Respuestas:
Para evitar enumerar el contenido de los directorios, puede:
Eso enumerará los nombres de directorio junto con los nombres de archivos comunes que comienzan con
a
oc
.Para completar, una solución que no involucra
find
puede ser:fuente
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 analizarls
.ls
es un juego justo en mi opinión./etc
es muy probable que los nombres sean sanos, un espacio simple interrumpirá ells
enfoque ya que los números de campo cambiarán. +1 porls -ld
aunque.LC_ALL=C
), no se garantiza que la fecha tenga 3 campos en otras configuraciones regionales.Recursivamente:
Si necesita no recurrencia, puede hacerlo de forma portátil:
O esto, de forma no portátil (GNU o un hallazgo reciente de BSD):
Si desea hacer este caso insensiblemente, use en
-iname
lugar de-name
.fuente
-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 GNUfind
si también desea excluir enlaces simbólicos a directorios).Puedes probar este comando también,
fuente
Si desea tanto los directores (no el contenido del directorio) como los archivos, puede usar
printf
bultin:Ejemplo:
fuente
No recursivo sin
find
:la
-p
añade una/
al final de directorios, que lagrep
filtra a cabo. Por supuesto, no funciona para nombres de archivo que contienen caracteres especiales como líneas nuevas.fuente
Con
zsh
:Enumeraría los archivos normales (como
-type f
enfind
) enumerados en/etc
cuyo nombre comienza cona
oc
. 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 quels -d /etc/[ac]*
podría enumerar incorrectamente un archivo llamado/etc/[ac]*
si no hay un archivo que comience pora
oc
dentro/etc
.enumeraría los archivos que no son de tipo directorio y
enumeraría los archivos que no son de tipo directorio después de resolver enlaces simbólicos.
fuente
Para mostrar archivos que comienzan con:
Para mostrar archivos que comienzan con c:
fuente