Cómo hacer coincidir * con archivos ocultos dentro de un directorio

21

Cómo hacer coincidir los archivos ocultos dentro de los directorios dados

por ejemplo

Si doy el siguiente comando, no está dando el resultado de los archivos ocultos,

 du -b maybehere*/*

cómo lograr esto simple usando un solo comando en lugar de usar

du -b maybehere*/.* maybehere*/*

ya que necesito escribir quizás aquí dos veces.

vidhan
fuente
Intente simplemente oculto maybehere*/.*y agregue lo anterior para todos
Costas
1
Su edición hace una nueva pregunta con restricciones adicionales, que convierte a la Q en un objetivo en movimiento, posiblemente invalidando las respuestas ya dadas. Eso son malos modales, solo haga una nueva pregunta si tiene una.
Anthon

Respuestas:

22

Aproveche la expansión de la llave:

du -b maybehere*/{*,.[^.],.??*}

o alternativamente

du -b maybehere*/{,.[^.],..?}*

La lógica detrás de esto probablemente no sea obvia, así que aquí hay una explicación:

  • * coincide con todos los archivos no ocultos
  • .[^.]coincide con los archivos cuyos nombres comenzaron con un solo punto seguido de no un punto; que son solo nombres de archivo de 2 caracteres en la primera forma.
  • .??* coincide con archivos ocultos que tienen al menos 3 caracteres de longitud
  • ..?* como arriba, pero el segundo personaje debe ser un punto

El punto es excluir los enlaces duros al directorio actual y principal ( .y ..), ¡pero incluir todos los archivos normales de tal manera que cada uno de ellos se cuente solo una vez!

Por ejemplo, lo más simple sería escribir

du -b maybehere*/{.,}*

Significa que la lista contiene un punto .y "nada" (nada está entre ,y se cierra }), por lo que todos los archivos ocultos (que comienzan desde un punto) y todos los archivos no ocultos (que comienzan desde "nada") coincidirían. El problema es que esto también coincidiría .y .., y esto probablemente no sea lo que desea, por lo que debemos excluirlo de alguna manera.


Última palabra sobre la expansión del aparato ortopédico.

La expansión de llaves es un mecanismo por el cual puede incluir más archivos / cadenas / lo que sea en la línea de comandos escribiendo menos caracteres. La sintaxis es {word1,word2,...}, es decir, es una lista de cadenas separadas por comas que comienza {y termina con }. bashEl manual proporciona un ejemplo de uso muy básico y al mismo tiempo muy común:

$ echo a{b,c,d}e
abe ace ade
jimmij
fuente
¿ { }
Cuál
@vidhan vea la edición y mire el man bashcapítulo "Expansión de llaves".
jimmij
¿le importaría darme más explicaciones sobre lo anterior y explicar un poco más claramente cómo funciona todo ya que soy nuevo con estas cosas @jimmij
vidhan
66
.??*no coincide .a, .b... .[^.]*no coincide ..foo.
Stéphane Chazelas
44
.foocoincide con ambos .[^.]*y .??*. Que desea {.[!.],..?,}*.
Stéphane Chazelas
14

Como ya estás usando la sintaxis específica de GNU ( -b):

du -abd1 maybehere*/

De esa manera, es duque enumera los archivos en los maybehere*directorios (y no excluye los archivos de puntos). -d1limita el informe del uso del disco a un nivel inferior (incluidos los no directorios con -a).

De lo contrario, para que los globos incluyan archivos ocultos (excepto .y ..), cada shell tiene su propia sintaxis:

  • zsh:

    du -b maybehere*/*(D)
  • ksh93:

    (FIGNORE='@(.|..)'; du -b maybehere*/*)
  • bash:

    (shopt -s dotglob; du -b maybehere*/*)
  • tcsh:

    (set globdot; du -b maybehere*/*)
  • yash:

    (set -o dot-glob; du -b maybehere*/*)

    aunque tenga cuidado, incluye .y ..en sistemas que los incluyen en el resultado de lo readdir() cual hace que sea difícil de usar.

Stéphane Chazelas
fuente
8

Otra opción está disponible aquí :

du -sm .[!.]* *
Fábio
fuente
¿Por qué querrías omitir los nombres de archivos que comienzan con ..?
Kusalananda
2
Presumiblemente, porque no quieren enumerar todo en ../y debajo.
Shadur
Esto no cuenta archivos como, por ejemplo ..myfile; agregar ..?*para eso. Pero +1 por usar la sintaxis glob adecuada para coincidencias negativas.
Pedro Gimeno
0

Si solo desea enumerar directorios ocultos u operar en directorios ocultos, entonces, como dijo Costas, puede usar

du -b maybehere*/.*

Esto le permitirá operar en archivos y directorios ocultos. Si solo desea directorios ocultos, puede especificarlo con

du -b maybehere*/.*/

SailorCire
fuente
¿Puedes ver la pregunta una vez más @SailorCire? La he editado un poco
vidhan
@vidhan, ¿entonces solo quieres trabajar en un directorio oculto? ¿Es eso correcto?
SailorCire
No, quiero hacer coincidir los archivos ocultos y no ocultos dentro de un directorio en lugar de usar du maybehere*/.*y maybehere*/*uno oculto y otro oculto
Vidhan
@vidhan du -brecoge tanto ocultos como no ocultos.
SailorCire
no :( lamentablemente @SailorCire
vidhan
0

Si bien no es shell directamente, puede usar find con profundidad limitada como esta

find maybehere -maxdepth 1 -exec du -sh {} \;
k3a
fuente