Excluir arquivos ocultos ao pesquisar com o Unix / Linux find?

35

Com quais opções eu preciso usar findpara excluir arquivos ocultos?

daí
fonte
4
Além disso: o motivo pelo qual não há suporte especial para esta tarefa é que a única coisa especial nos arquivos nomeados com um '.' Inicial é que não são listados por, a lsmenos que seja especificamente solicitado: eles são arquivos completamente comuns em todos os aspectos, é apenas isso que lspermite ignorá-los por padrão.
precisa
2
Pergunta: você quer esconder algo assim .hidden/visible.txt?
Keith Thompson

Respostas:

14

Encontrei isso aqui :

find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
Jarvin
fonte
Por que não apenas \( ! -name '.*' \)?
grawity
@rawity Acabei de descobrir isso, não sei completamente como isso funciona. O seu não ocultaria apenas arquivos ocultos, mas diretórios ocultos e todo o seu conteúdo secundário e arquivos ocultos em subpastas?
Jarvin
5
Não, não seria: / Mas \( ! -path '*/.*' \)seria.
grawity
@rawity Ya, acho que fiz uma suposição sobre o que o OP queria ... Sua solução de nome é provavelmente a mais próxima do que eles estavam pedindo.
Jarvin
@ grawity & Dan: não é (! -caminho '^. *') ?? suas soluções ignorarão qualquer arquivo que tenha um '.' em qualquer lugar no nome do arquivo como a.exe, b.out etc ....
Software Mechanic
13

Parece que o padrão glob de negação não é bem conhecido. Então você pode usar:

find . -name "[!.]*"
ponto vermelho
fonte
12

Isso não responde à sua pergunta, mas para a tarefa de encontrar arquivos não ocultos, gosto de deixar encontrar todos os arquivos e filtrá-los com grep.

find . -type f | grep -v '/\.'

Semelhante à sua abordagem, mas talvez um pouco mais simples.

Simon Chiang
fonte
Este foi o único dos forros que funcionou para mim.
entpnerd 8/08/16
7

Tente o seguinte finduso:

find . -type f -not -path '*/\.*'

O que ignoraria todos os arquivos ocultos (arquivos e diretórios começando com um ponto).

kenorb
fonte
1

Escrevi um script chamado, findnhque acredito que lida com certos casos extremos melhor do que as respostas a essa pergunta que consegui encontrar na web.

#!/bin/bash

declare -a paths

while [ $# -ne 0 ]; do
  case "$1" in -*) break ;; esac
  paths+=("$1")
  shift
done

find "${paths[@]}" \( -name . -o -name .. -o \! \( -name '.*' -prune \) \) "$@"

Por exemplo, você pode encontrar arquivos e diretórios não ocultos dentro de um diretório oculto especificado explicitamente com um comando como findnh ~/.hiddendir/, que será exibido, ~/.hiddendir/filemas não ~/.hiddendir/.superhiddenfile.

Kurt Glastetter
fonte
1
Bom pedaço de codificação. Exceto que, quando tento findnh ~/.hiddendir/, não recebo nada. Fora isso, como isso é diferente ! -path '*/.*'e find … | grep -v '/\.'?
G-Man diz 'Reinstate Monica'
1

Se você objetivos é finde grep, ripgrepnão exclui arquivos ocultos por padrão, por exemplo,

rg --files

--files Imprima cada arquivo que seria pesquisado sem realmente executar a pesquisa.

kenorb
fonte
1

fd

Use fd, uma alternativa simples, muito mais rápida e fácil de usar find. Por padrão, ele:

  • Ignora diretórios e arquivos ocultos, por padrão.
  • Ignora padrões do seu .gitignore, por padrão.

Verifique a análise de benchmark .

kenorb
fonte
1

Para encontrar arquivos ocultos:

find -name '[.]*'

Para encontrar arquivos visíveis:

find -name '[!.]*'

É simples assim.

Carmin
fonte