como globar todos os arquivos ocultos, exceto o diretório atual e pai [duplicado]

51

Desejo globar todos os arquivos e diretórios ocultos, mas não o diretório atual ( . ) e pai ( .. ).

Estou usando o bash.

Observar o comportamento atual:

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

Gostaria que o .* se comportasse assim

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

Existe a opção de shell dotglob

$ shopt -s dotglob

que funciona de certa forma; agora posso usar * para globar 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 com que .* não seja expandido para . e .. ?

    
por lesmana 24.08.2010 / 12:16

7 respostas

49

Você pode usar a variável GLOBIGNORE para ocultar os diretórios . e .. . Isso também define automaticamente a opção dotglob , portanto, * agora corresponde a arquivos ocultos e não ocultos. Você pode novamente desanexar manualmente o dotglob , embora isso forneça 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
    
por 24.08.2010 / 14:53
8

Esta glob requer um ponto inicial e pelo menos um outro caractere não pontual. Isso fará com que todos os possíveis arquivos ocultos sejam eliminados, mas não . ou .. , que é exatamente o que você pediu.

ls -ld .[!.]*
    
por 17.10.2013 / 22:08
6

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

Algo como (assumindo o GNU find ):

find . -mindepth 1 -maxdepth 1 -name ".*" -printf "%P\n"
    
por 24.08.2010 / 13:10
5

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

echo .*

(os globs desses shells nunca expandem . ou .. , que é a coisa mais sensata a fazer).

com bash :

shopt -s dotglob
echo [.]*

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

Ou:

GLOBIGNORE=.
echo .*

(com bash , como dotglob e pela mesma razão, assim que GLOBIGNORE não estiver vazio, . e .. serão automaticamente ignorados em globs e não contém barras (e dotglob está habilitado) e desta vez mesmo com um literal . como acima, observe que GLOBIGNORE=/ , por exemplo, teria o mesmo efeito.

No entanto, observe que . e .. ainda seriam incluídos em globs como dir/.* ou .*/file .

com ksh93

FIGNORE='@(.|..)'
echo .*
    
por 09.01.2014 / 11:23
2

tente ls -A .

trecho do manual

"-A, --almost-all do not list implied . and ..")

    
por 24.04.2014 / 11:34
2

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

Use esse curinga {.[!.]*,..?*}

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
    
por 08.08.2014 / 18:19
-1
ls -1a|egrep -v '^(\.|\.\.)$'
    
por 24.08.2010 / 13:00