it-swarm-es.tech

Cómo glob cada archivo oculto, excepto el directorio actual y principal

Quiero glob cada archivo y directorio oculto, pero no el actual (.) y el directorio padre (..).

Estoy usando bash.

Observar el comportamiento actual:

$ ls -a
.  ..  ...a  ...aa  ..a  ..aa  .a  .aa  .aaa  a
$ echo *
a
$ echo .*
. .. ...a ...aa ..a ..aa .a .aa .aaa

Me gustaría .* comportarse así

$ echo .*
...a ...aa ..a ..aa .a .aa .aaa

Existe la opción Shell dotglob

$ shopt -s dotglob

eso funciona de alguna manera; ahora puedo usar * para glob todo (oculto o no) pero no . y ..

$ echo *
...a ...aa ..a ..aa .a .aa .aaa a

pero ahora no puedo diferenciar entre oculto o no. También, .* todavía hay globos . y ..

$ echo .*
. .. ...a ...aa ..a ..aa .a .aa .aaa

¿Hay alguna manera de hacer .* no se expande a . y ..?

70
lesmana

Puede usar la variable GLOBIGNORE para ocultar la . y .. directorios. Esto también establece automáticamente la opción dotglob, por lo que * ahora coincide con archivos ocultos y no ocultos. Sin embargo, puede desarmar manualmente dotglob, sin embargo, esto le da el comportamiento que desea.

Ver este ejemplo:

$ ls -a
.  ..  a  .a  ..a
$ GLOBIGNORE=".:.."
$ shopt -u dotglob
$ echo * # all (only non-hidden)
a
$ echo .* # all (only hidden)
.a ..a
65
Marcel Stimberg

Este globo requiere un punto inicial y al menos otro carácter que no sea punto. Esto bloqueará los posibles archivos ocultos, pero no . o .., que es exactamente lo que pediste.

ls -ld .[!.]*
20
bukzor

¿Estás buscando archivos? ¿Está en condiciones de usar find?

Algo así como (suponiendo GNU find):

find . -mindepth 1 -maxdepth 1 -name ".*" -printf "%P\n"
6
Deano

Con zsh, fish, pdksh y al menos algunas de sus derivadas como mksh, posh:

echo .*

(los globos de esos proyectiles nunca se expanden . o .., que es lo más sensato).

Con bash:

shopt -s dotglob
echo [.]*

(con dotglob, . y .. no se expanden a menos que use un globo que comienza con un literal . como en .* o dir/.*, de lo contrario, cosas como chmod +rwx -- * tendría consecuencias inesperadas).

O:

GLOBIGNORE=.
echo .*

(con bash, como para dotglob y por la misma razón, tan pronto como GLOBIGNORE no esté vacío, ambos . y .. se ignoran automáticamente en los globos que no contienen barras diagonales (y dotglob está habilitado) y esta vez incluso con un literal . como anteriormente. Tenga en cuenta que GLOBIGNORE=/ por ejemplo tendría el mismo efecto).

Sin embargo, tenga en cuenta que . y .. aún se incluiría en globos como dir/.* o .*/file.

Con ksh93

FIGNORE='@(.|..)'
echo .*
6

Desea mostrar archivos/carpetas ocultos PERO . y ..?

Utilice este comodín bash {.[!.]*,..?*}

Datos de muestra

Puede intentar generando datos de muestra:

$ touch ...a  ...aa  ..a  ..aa  .a  .aa  .aaa  a
$ mkdir ...b  ...bb  ..b  ..bb  .b  .bb  .bbb  b

Prueba

A continuación puede ver las entradas eliminadas esperadas:

$ diff <(\ls -a) <(\ls -ad {.[!.]*,..?*})
1,3d0
< .
< ..
< a
11d7
< b

Pro

Útil para eliminar todos los elementos ocultos, por ejemplo:

$ rm -rf .*
rm: cannot remove directory: `.'
rm: cannot remove directory: `..'

# <regenerate sample data here>

$ rm -rf {.[!.]*,..?*}
# No error
4
frntn

tratar ls -A.

extracto del manual

"-A, --casi-todo no lista implícita. Y ...")

2
Orso Grigio
ls -1a|egrep -v '^(\.|\.\.)$'
0
codehead