Respostas:
O comando :
ls -ld .?*
Listará apenas arquivos ocultos.
Explicar :
-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
.
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 .!(|.)
ls -d .!(|.)
Faz exatamente o que o OP está procurando.
!(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
echo .[^.]*
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
:
find -mindepth 1 -prune -name '.*'
Os -mindepth
garante que não correspondem .
e os -prune
meios que find
não vai descer para os subdiretórios.
Usando find
e awk
,
find . -type f | awk -F"/" '$NF ~ /^\..*$/ {print $NF}'
Explicação:
find . -type f
-> Liste todos os arquivos no diretório atual e seu caminho, como
./foo.html
./bar.html
./.foo1
awk -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.
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.
find . -mindepth 1 -maxdepth 1 -name '.*'
ou
find . -mindepth 1 -maxdepth 1 -name '.*' -o -name '*~'
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.
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
.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ário cat .hidden
? Seu find
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 | grep "^\." | grep -v "^\.$" | grep -v "^\..$"
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.
find -maxdepth 1 -name ".[!.]*"
ls
deve analisar a saída de .
O que mais você poderia ter feito, is ls .?*
ou ls .!(|)
isso mostrará tudo nos arquivos / diretórios ocultos do diretório atual na parte superior e nos 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 / diretórios com seus subdiretórios e todos os arquivos ocultos 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 @ resposta cioby23 ls -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.
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
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 é:
ls -d $(echo -e "$(\ls)\n$(\ls -A)" | sort | uniq -u)
Explicação
O que isso faz é listar todos os arquivos (e diretórios) duas vezes,
echo -e "$(\ls)\n$(\ls -A)"
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
porque echo -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
.
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ões ls
serão usados ?
para caracteres especiais, portanto .foo\tbar
( \t
=> guia) e .foo\nbar
( \n
=> nova linha) aparecerão como foo?bar
).
Como alternativa, você também pode usar echo .*
por exemplo
user@linux:~$ echo .*
. .. .bash_aliases .bash_history .bash_logout .bashrc
user@linux:~$
Se você preferir em formato de lista longa, basta converter o espaço em branco em uma nova linha.
user@linux:~$ echo .* | tr ' ' '\n'
.
..
.bash_aliases
.bash_history
.bash_logout
.bashrc
user@linux:~$
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 :
A
GLOBIGNORE
variável shell pode ser usada para restringir o conjunto de nomes de arquivos que correspondem a um padrão. SeGLOBIGNORE
estiver definido, cada nome de arquivo correspondente que também corresponda a um dos padrõesGLOBIGNORE
é removido da lista de correspondências. Se anocaseglob
opção estiver configurada, a correspondência com os padrõesGLOBIGNORE
é executada sem considerar o caso. Os nomes de arquivos.
e..
sempre são ignorados quandoGLOBIGNORE
definidos e não nulos. No entanto, a configuraçãoGLOBIGNORE
para um valor não nulo tem o efeito de ativar a opção shell do dotglob, para que todos os outros nomes de arquivos que começam com‘.
'correspondam.
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:
GLOBIGNORE=.
ls -d .*
ls -ld .*
ouls -ald .*
vai funcionar