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.
Que comando devo usar?
command-line
ls
nux
fonte
fonte
ls -ld .*
ouls -ald .*
vai funcionarRespostas:
O comando :
Listará apenas arquivos ocultos.
Explicar :
fonte
.
e..
da partida. No entanto, também excluirá nomes de arquivos ocultos de caractere único (perfeitamente legais), como.a
,.1
etc. Talvez um glob melhor estendida seria.!(|.)
dot ou seja literal seguido por qualquer coisa, exceto nada ou de outra (single) dot iels -d .!(|.)
Faz exatamente o que o OP está procurando.
fonte
!(pattern-list)
,pattern-list
há uma lista de um ou mais padrões separados por a|
, mas é confuso para mim que você não tenha nenhum padrão à esquerda de|
. Você poderia me explicar essa sintaxe?.
não é seguido por (nada ou.
), excluindo-.
se e..
.Se você quiser apenas os arquivos em seu diretório atual (sem recursão), poderá fazer
Isso imprimirá os nomes de todos os arquivos cujo nome começa com a
.
e é seguido por um ou mais caracteres que não são pontos. 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
:Os
-mindepth
garante que não correspondem.
e os-prune
meios quefind
não vai descer para os subdiretórios.fonte
trabalha para mim no Bash.
fonte
.
e..
em BashUsando
find
eawk
,Explicação:
find . -type f
-> Liste todos os arquivos no diretório atual e seu caminho, comoawk -F"/" '$NF ~ /^\..*$/ {print $NF}'
/
como o separador de campo awk verifica o último campo olhando com um ponto ou não. Se começar com um ponto, imprime o último campo dessa linha correspondente.fonte
find -type f
. Você não precisa definir explicitamente o caminho da pesquisa ou-name "*"
.find
geralmente é uma opção melhor para pesquisas complicadas do que usar globbing de nome.ou
find .
pesquisa no diretório atual-mindepth 1
exclui. e .. da lista-maxdepth 1
limita a pesquisa ao diretório atual-name '.*'
encontre nomes de arquivos que começam com um ponto-o
ou-name '*~'
encontre nomes de arquivos que terminem 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 os arquivos que estão no
.hidden
arquivo do diretório atual . Se você estiver escrevendo um script, essas linhas lerão o.hidden
arquivo e exibirão os nomes dos arquivos existentes.fonte
.hidden
arquivo? Por que haveria um arquivo chamado.hidden
que contém os nomes dos arquivos? De qualquer forma, se houver, por que você faria algo tão complexo quando tudo o que seria necessáriocat .hidden
? Seufind
comando está correto (ish), mas o-name '*~'
é irrelevante. Os arquivos que terminam em tildes são arquivos de backup, mas não ocultos de forma alguma..hidden
arquivo é para arquivos e pastas que você deseja ocultar quando não pode alterar o nome do arquivo / pasta para começar com um ponto. Quanto aos arquivos que terminam em tildes, isso depende do sistema.ls -B
irá ignorar esses arquivos, assim como a maioria dos exploradores de arquivos da GUI.cat .hidden
pode mostrar arquivos que não existem mais se esses arquivos foram excluídos ou movidos desde que foram adicionados ao.hidden
arquivo.Eu acho que você pode fazê-lo com o seguinte comando.
ls -a
comando que você digitou, que mostra todos os arquivos e diretórios no diretório de trabalho atual.grep "^\."
comando que eu anexei, que filtra a saída para mostrar apenas arquivos ocultos (o nome começa com"."
).grep -v "^\.$" | grep -v "^\..$"
comando que eu anexei, que filtra a saída para excluir., .. (Eles são o diretório atual e o pai).Se alguns nomes de arquivos puderem ter mais de uma linha
"\n"
, o exemplo acima pode estar incorreto.Então, sugiro o seguinte comando para resolvê-lo.
fonte
ls
deve analisar a saída de .O que mais você poderia ter feito,
is ls .?*
ouls .!(|)
isso mostrará tudo nos arquivos / diretórios ocultos do diretório atual na parte superior e nos outros arquivos / diretórios abaixopor exemplo: do meu terminal
Agora observe nos resultados acima, ele mostra todos os arquivos / diretórios com seus subdiretórios e todos os arquivos ocultos logo abaixo.
Desculpe, não posso comentar. para explicar a diferença aqui entre
ls .?*
e @ resposta cioby23ls -d .[!.]* .??*
E por isso que é realmente a impressão de arquivos ocultos duas vezes é porque literalmente você está perguntando duas vezes.??*
,.?*
,.[!.]*
eles são a mesma coisa, então a adição de qualquer um deles com diferentes caracteres de comando irá imprimir duas vezes.fonte
Você também pode usar:
Isso permitirá que você exiba arquivos ocultos normais e arquivos ocultos que começam com 2 ou 3 pontos, por exemplo:
..hidden_file
fonte
você pode usar o comando
Isso tem a vantagem de permitir a listagem de várias colunas, diferente da abordagem baseada em grep nas
ls -a | grep "^\."
soluçõesfonte
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 vim com outra solução, que pode não ser tão eficiente, mas essa solução não assume nada sobre os nomes dos arquivos ocultos e, portanto, evita a listagem
..
no resultado (assim como a resposta atualmente aceita).O comando completo é:
Explicação
O que isso faz é listar todos os arquivos (e diretórios) duas vezes,
mas apenas mostrando arquivos ocultos uma vez
-A
.Em seguida, a lista é classificada, o
| sort
que faz com que os arquivos regulares (não ocultos) sejam exibidos duas vezes e próximos um do outro.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 muru apontou, esta solução não funcionará corretamente se houver arquivos com nomes como,
escaped\ncharacter.txt
porqueecho -e
dividirá o nome do arquivo em duas linhas. Também não funcionará conforme o esperado se houver dois arquivos ocultos quase com o mesmo nome, exceto por um caractere especial, como.foo[tab].txt
e.foo[new-line].txt
como ambos são impressos.foo?.txt
e seriam eliminados poruniq -u
fonte
.
como o primeiro caractere...
, mas eu me pergunto o quão bem ele funciona com nomes de arquivos contendo caracteres especiais.echo -e
serão interpretadas. Além disso:ls
não irá alterar nomes de arquivos para que dois nomes de arquivos diferentes sejam exibidos da mesma forma (por exemplo, em algumas versõesls
serão usados?
para caracteres especiais, portanto.foo\tbar
(\t
=> guia) e.foo\nbar
(\n
=> nova linha) aparecerão comofoo?bar
).Como alternativa, você também pode usar
echo .*
por exemplo
Se você preferir em formato de lista longa, basta converter o espaço em branco em uma nova linha.
fonte
Com o bash, definir a
GLOBIGNORE
variável especial é algum valor não vazio é suficiente para fazê-lo ignorar.
e..
ao expandir globs. Dos documentos do Bash :Se o definirmos
.:..
, ambos.
e..
serão ignorados. Como configurá-lo para algo que não seja nulo também terá esse comportamento, é melhor configurá-lo para apenas.
Assim:
fonte