Como excluir / ignorar arquivos e diretórios ocultos em uma pesquisa de "localização" incorporada com curinga?

94

A partir de (observe os curingas antes e depois de "algum texto")

find . -type f -name '*some text*'

como se pode excluir / ignorar todos os arquivos e diretórios ocultos?

Eu já fiz googling por muito tempo , me deparei com alguns -prima e! (ponto de exclamação), mas nenhum exemplo de ajuste (e parcimonioso) que acabou de funcionar .

Piping | to grep seria uma opção e eu também gostaria de receber exemplos disso; mas principalmente Estou interessado em um breve one-liner (ou um par de one-liners independentes, ilustrando diferentes maneiras de atingir o mesmo objetivo de linha de comando) apenas usando find .

ps: Encontre arquivos no linux e exclua diretórios específicos parece estreitamente relacionado, mas a) não é aceito ainda e b) é relacionado-mas-diferente-e-distinto, mas c) pode fornecer inspiração e ajudar a identificar a confusão!

Editar

find . \( ! -regex '.*/\..*' \) -type f -name "whatever" , funciona. O regex procura "qualquer coisa, depois uma barra, depois um ponto, depois qualquer coisa" (isto é, todos os arquivos e pastas ocultos incluindo suas subpastas) e o "!" nega o regex.

    
por nutty about natty 10.03.2013 / 12:58

6 respostas

3

A resposta que publiquei originalmente como "edição" para a minha pergunta original acima:

find . \( ! -regex '.*/\..*' \) -type f -name "whatever" , funciona. O regex procura "qualquer coisa, depois uma barra, depois um ponto, depois qualquer coisa" (isto é, todos os arquivos e pastas ocultos incluindo suas subpastas) e o "!" nega o regex.

    
por nutty about natty 11.08.2015 / 09:31
102

Isso imprime todos os arquivos que são descendentes de seu diretório, ignorando arquivos e diretórios ocultos:

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

Portanto, se você estiver procurando por um arquivo com some text em seu nome e quiser pular arquivos e diretórios ocultos, execute:

find . -not -path '*/\.*' -type f -name '*some text*'

Explicação:

A opção -path executa verificações de um padrão na cadeia de caminho inteira. * é um caractere curinga, / é um separador de diretório, \. é um ponto (ele precisa ser de escape para evitar um significado especial) e * é outro curinga. -not significa não selecionar arquivos que correspondam a este teste.

Eu não acho que find seja inteligente o suficiente para evitar a busca recursiva de diretórios ocultos no comando anterior, portanto, se você precisar de velocidade, use -prune , desta forma:

 find . -type d -path '*/\.*' -prune -o -not -name '.*' -type f -name '*some text*' -print
    
por Flimm 09.07.2013 / 18:30
5

Este é um dos poucos meios de excluir arquivos de pontos que também funcionam corretamente no BSD, Mac e Linux:

find "$PWD" -name ".*" -prune -o -print
  • $PWD imprime o caminho completo para o diretório atual para que o caminho não comece com ./
  • -name ".*" -prune corresponde a quaisquer arquivos ou diretórios que começam com um ponto e não descendem
  • -o -print significa imprimir o nome do arquivo se a expressão anterior não corresponder a nada. Usar -print ou -print0 faz com que todas as outras expressões não sejam impressas por padrão.
por eradman 24.03.2016 / 14:51
4
find $DIR -not -path '*/\.*' -type f \( ! -iname ".*" \)

Exclui todos os diretórios ocultos e arquivos ocultos em $ DIR

    
por guest 28.02.2014 / 01:49
3

Você não precisa usar find para isso. Apenas use globstar em shell-like, como:

echo **/*foo*

ou:

ls **/*foo*

em que **/ representa qualquer pasta de forma recursiva e *foo* de qualquer arquivo que tenha foo em seu nome.

Por padrão, usar ls imprimirá nomes de arquivos, exceto arquivos e diretórios ocultos.

Se você não tiver globbing ativado, faça isso em shopt -s globstar .

Nota: Uma nova opção de globbing funciona no Bash 4, zsh e conchas semelhantes.

Exemplo:

$ mkdir -vp a/b/c/d
mkdir: created directory 'a'
mkdir: created directory 'a/b'
mkdir: created directory 'a/b/c'
mkdir: created directory 'a/b/c/d'
$ touch a/b/c/d/foo a/b/c/d/bar  a/b/c/d/.foo_hidden a/b/c/d/foo_not_hidden
$ echo **/*foo*
a/b/c/d/foo  a/b/c/d/foo_not_hidden
    
por kenorb 20.04.2015 / 11:49
1

find tem comutadores lógicos perfeitos, como -and e -not , você pode usá-los para sua vantagem para encontrar um arquivo correspondente com duas regras assim:

$ touch non_hidden_file.txt .hidden_file.txt somethings/.another_hidden_file.txt                                                 

$ find . -type f -name '*hidden_file*' -and \( -not -name ".*" \)                            
./non_hidden_file.txt

Como você pode ver, find usa duas regras -name '*hidden_file*' e -and \( -not -name ".*" \) para encontrar os nomes de arquivos que correspondem às duas condições - nome do arquivo com hidden_file , mas sem ponto inicial. Observe as barras na frente dos parênteses - elas são usadas para definir parênteses como find argumentos, em vez de definir um subshell (que é o que significa o parêntese de outra forma sem barras)

    
por Sergiy Kolodyazhnyy 16.05.2017 / 00:01