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 ..
?
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
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 .[!.]*
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"
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 .*
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
experimentar ls -A
.
trecho do manual
"-A, - quase tudo não lista implícita. E ..")
ls -1a|egrep -v '^(\.|\.\.)$'