Como mostrar apenas arquivos ocultos no Terminal?

111

Eu tenho um diretório que contém milhares de arquivos, alguns deles estão ocultos.

O comando ls -a lista todos os arquivos, incluindo os ocultos, mas eu preciso apenas listar os arquivos ocultos.

Qual comando devo usar?

    
por nux 19.05.2014 / 02:10

12 respostas

141

O comando:

ls -ld .?* 

Listará apenas arquivos ocultos.

Explique:

 -l     use a long listing format

 -d, --directory
              list  directory entries instead of contents, and do not derefer‐
              ence symbolic links

.?* will only state hidden files 
    
por nux 19.05.2014 / 02:10
28
ls -d .!(|.)

Faz exatamente o que o OP está procurando.

    
por patrick 19.05.2014 / 06:52
13

Se você quer apenas os arquivos em seu diretório atual (sem recursão), você poderia fazer

echo .[^.]*

Isso imprimirá os nomes de todos os arquivos cujo nome começa com . e é seguido por um ou mais caracteres não ponto. Observe que isso falhará nos arquivos cujo nome começa com pontos consecutivos, portanto, por exemplo, ....foo não será mostrado.

Você também pode usar find :

find -mindepth 1 -prune -name '.*'

O -mindepth garante que não correspondamos a . e a -prune significa que find não irá para os subdiretórios.

    
por terdon 19.05.2014 / 04:57
11
ls -ad .*

funciona para mim no Bash.

    
por Mark 19.05.2014 / 06:55
4

Usando find e awk ,

find . -type f | awk -F"/" '$NF ~ /^\..*$/ {print $NF}'

Explicação:

find . -type f - > Listar todos os arquivos no diretório atual junto com o caminho,

./foo.html
./bar.html
./.foo1

awk -F"/" '$NF ~ /^\..*$/ {print $NF}'

/ como separador de campo awk verifica se o último campo está com um ponto ou não. Se começar com um ponto, ele imprime o último campo da linha correspondente.

    
por Avinash Raj 19.05.2014 / 04:46
3

find é geralmente uma opção melhor para pesquisas complicadas do que usando o nome globbing.

find . -mindepth 1 -maxdepth 1 -name '.*'

ou

find . -mindepth 1 -maxdepth 1 -name '.*' -o -name '*~'

find . pesquisa o diretório atual

-mindepth 1 exclui. e .. da lista

-maxdepth 1 limita a pesquisa ao diretório atual

-name '.*' encontra nomes de arquivos que começam com um ponto

-o ou

-name '*~' encontra nomes de arquivos que terminam com um til (geralmente, esses são arquivos de backup de programas de edição de texto)

No entanto, esta e todas as outras respostas perdem arquivos que estão no arquivo .hidden do diretório atual. Se você estiver escrevendo um script, essas linhas lerão o arquivo .hidden e exibirão os nomes dos arquivos existentes.

if [[ -f .hidden]] # if '.hidden' exists and is a file
then
    while read filename # read file name from line
    do
        if [[ -e "$filename" ]] # if the read file name exists
        then
            echo "$filename" # print it
        fi
    done < .hidden # read from .hidden file
fi
    
por Mark H 19.05.2014 / 23:24
2

O que mais você poderia ter feito, is ls .?* Ou ls .!(|) que mostrará tudo no diretório atual de pastas / arquivos ocultos no topo e outros arquivos / diretórios abaixo

por exemplo: do meu terminal

$ ls .?*       
.bash_history    .dmrc        .macromedia   .weather
.bash_logout     .gksu.lock   .profile      .wgetrc
.bash_profile    .bashrc.save .ICEauthority .toprc           .Xauthority
.bashrc          .lastdir     .viminfo      .xsession-errors
.bashrc~         .dircolors   .lynxrc       .vimrc           .xsession-errors.old

..:
Baron

.adobe:
Flash_Player

.aptitude:
cache  config

.cache:
compizconfig-1                              rhythmbox
dconf                                       shotwell

Agora observe nos resultados acima, ele mostra todos os arquivos / pastas com seu subdir e qualquer arquivo oculto logo abaixo.

[1:0:248][ebaron@37signals:pts/4][~/Desktop]
$ ls .!(|)
.bash_aliases  .bashrc1  .bashrc1~

..:
askapache-bash-profile.txt  examples.desktop             Public           top-1m.csv
backups             Firefox_wallpaper.png        PycharmProjects          top-1m.csv.zip
Desktop             java_error_in_PYCHARM_17581.log  Shotwell Import Log.txt  topsites.txt
Documents           Music                Templates            Videos
Downloads           Pictures                 texput.log           vmware

Desculpe, não posso comentar. para explicar a diferença aqui entre ls .?* e @ cioby23 answer ls -d .[!.]* .??* E por que é realmente imprimir arquivos ocultos duas vezes é porque literalmente você está pedindo duas vezes .??* , .?* , .[!.]* eles são a mesma coisa , portanto, adicionar qualquer um deles com diferentes caracteres de comando será impresso duas vezes.

    
por amrx 19.03.2015 / 06:47
2

Acho que você pode fazer isso com o seguinte comando.

ls -a | grep "^\." | grep -v "^\.$" | grep -v "^\..$"

ls -a comando que você inseriu, que mostra todos os arquivos e diretórios no diretório de trabalho atual.

grep "^\." comando Eu adicionei, que filtra a saída para mostrar apenas arquivos ocultos (o nome começa com "." ).

grep -v "^\.$" | grep -v "^\..$" comando Eu adicionei, que filtra saída para excluir., .. (Eles são diretório atual e pai).

Se alguns nomes de arquivos podem ter mais de uma linha com "\n" , o exemplo acima pode estar incorreto.

Então sugiro seguir o comando para resolver o problema.

find -maxdepth 1 -name ".[!.]*"
    
por xiaodongjie 19.05.2014 / 04:00
1

Todas as respostas até agora são baseadas no fato de que os arquivos (ou diretórios) cujos nomes começam com um ponto estão "ocultos". Eu criei outra solução, que pode não ser tão eficiente, mas essa solução não pressupõe nada sobre os nomes dos arquivos ocultos e, portanto, evita listar .. no resultado (assim como a resposta aceita atualmente).

O comando completo é:

ls -d $(echo -e "$(\ls)\n$(\ls -A)" | sort | uniq -u)

Explicação

O que isto faz é listar todos os arquivos (e diretórios) duas vezes,

echo -e "$(\ls)\n$(\ls -A)"

mas mostrando apenas arquivos ocultos uma vez -A .

Em seguida, a lista é classificada em | sort , o que torna os arquivos regulares (não exibidos) exibidos duas vezes e próximos uns dos outros.

Em seguida, remova todas as linhas que aparecem mais de uma vez | uniq -u , deixando apenas linhas exclusivas.

Finalmente, use ls novamente para listar todos os arquivos com as opções personalizadas do usuário e sem listar o conteúdo dos diretórios na lista -d .

EDIT (Limitações):

Como observou a muru, essa solução não funcionará corretamente se houver arquivos com nomes como escaped\ncharacter.txt porque echo -e dividirá o nome do arquivo em duas linhas. Ele também não funcionará como esperado se houver dois arquivos ocultos com quase o mesmo nome, exceto por um caractere especial, como .foo[tab].txt e .foo[new-line].txt , pois ambos são impressos como .foo?.txt e seriam eliminados por uniq -u

    
por alejandro 26.09.2018 / 04:00
1

Você também pode usar:

ls -d .[!.]* .??*

Isso permitirá que você exiba arquivos ocultos normais e arquivos ocultos que começam com 2 ou 3 pontos, por exemplo: ..hidden_file

    
por cioby23 19.05.2014 / 07:05
1

você pode usar o comando

ls -Ad .??*

Isso tem a vantagem de permitir a listagem em várias colunas, ao contrário da abordagem baseada em grep no ls -a | grep "^\." solutions

    
por Maythux 06.05.2015 / 17:46
0

Com o bash, a configuração da variável GLOBIGNORE special é um valor não vazio que é suficiente para ignorar . e .. ao expandir globs. De os documentos do Bash :

% bl0ck_qu0te%

Se o definirmos como .:.. , tanto . como .. serão ignorados. Como configurá-lo para qualquer coisa não-nula também obterá esse comportamento, podemos defini-lo como apenas .

Então:

GLOBIGNORE=.
ls -d .*
    
por muru 26.09.2018 / 04:36