web-development-kb-pt.site

como glob todos os arquivos ocultos, exceto diretório atual e pai

Quero enviar todos os arquivos e diretórios ocultos, mas não os atuais (.) e o diretório pai (..).

Eu estou usando o bash.

Observe o comportamento atual:

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

Eu gostaria .* para se comportar assim

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

Existe a opção Shell dotglob

$ shopt -s dotglob

isso funciona de uma maneira; agora eu posso usar * glob tudo (oculto ou não), mas não . e ..

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

mas agora não consigo diferenciar entre oculto ou não. Além disso, .* ainda globs . e ..

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

Existe uma maneira de fazer .* não expanda para . e ..?

70
lesmana

Você pode usar a variável GLOBIGNORE para ocultar a . e .. diretórios. Isso também define automaticamente a opção dotglob, então * agora corresponde aos arquivos ocultos e não ocultos. Você pode novamente desabilitar manualmente dotglob, porém, isso fornece o comportamento desejado.

Veja este exemplo:

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

Esse globo requer um ponto inicial e pelo menos um outro caractere que não seja ponto. Isso fará com que todos os arquivos ocultos possíveis sejam excluídos, mas não . ou .., exatamente o que você pediu.

ls -ld .[!.]*
20
bukzor

Você está apenas procurando por arquivos? Você está em posição de usar find?

Algo como (assumindo GNU find):

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

Com zsh, fish, pdksh e pelo menos alguns de seus derivados como mksh, posh:

echo .*

(os globs dessas conchas nunca se expandem . ou .., que é a coisa mais sensata a se fazer).

Com bash:

shopt -s dotglob
echo [.]*

(com dotglob, . e .. não são expandidos, a menos que você use uma glob que comece com um literal . como em .* ou dir/.*, caso contrário, coisas como chmod +rwx -- * teria consequências inesperadas).

Ou:

GLOBIGNORE=.
echo .*

(com bash, como para dotglob e pelo mesmo motivo, assim que GLOBIGNORE estiver vazio, os dois . e .. são automaticamente ignorados nos globs e não contêm barras (e dotglob está ativado) e, desta vez, mesmo com um literal . como acima. Observe que GLOBIGNORE=/ por exemplo, teria o mesmo efeito).

Observe no entanto que . e .. ainda seria incluído em globs como dir/.* ou .*/file.

Com ksh93

FIGNORE='@(.|..)'
echo .*
6
Stéphane Chazelas

Você deseja mostrar arquivos/pastas ocultos, MAS . e ..?

Use este curinga do bash {.[!.]*,..?*}

Dados da amostra

Você pode tentar gerando dados de amostra:

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

Prova

Abaixo, você pode ver as entradas removidas esperadas:

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

Pro

Útil para excluir todos os elementos ocultos, por exemplo:

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

# <regenerate sample data here>

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

experimentar ls -A.

trecho do manual

"-A, - quase tudo não lista implícita. E ..")

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