A partir de (observe os caracteres curinga antes e depois de "algum texto")
find . -type f -name '*some text*'
como excluir / ignorar todos os arquivos e diretórios ocultos?
Eu já estou pesquisando há muito tempo , me deparei com alguns - podar e! (ponto de exclamação), mas nenhum exemplo apropriado (e parcimonioso) que funcionou .
Tubulação |
para grep
seria uma opção e eu também gostaria de receber exemplos disso; mas, principalmente , estou interessado em uma única linha (ou duas linhas independentes, ilustrando maneiras diferentes de atingir o mesmo objetivo de linha de comando) que apenas estou usando find
.
ps: Localizar arquivos no linux e excluir diretórios específicos parece intimamente relacionado, mas a) ainda não foi aceito eb) está 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"
, trabalho. O regex procura por "qualquer coisa, depois uma barra, depois um ponto e depois qualquer coisa" (ou seja, todos os arquivos e pastas ocultos, incluindo suas subpastas) e o "!" nega o regex.
fonte
Respostas:
Isso imprime todos os arquivos que são descendentes do seu diretório, pulando arquivos e diretórios ocultos:
Portanto, se você estiver procurando por um arquivo com
some text
seu nome e quiser pular arquivos e diretórios ocultos, execute:Explicação:
A
-path
opção executa verifica um padrão em toda a cadeia de caminho.*
é um curinga,/
é um separador de diretório,\.
é um ponto (ele precisa ser escapado 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 pesquisa recursiva de diretórios ocultos no comando anterior; portanto, se você precisar de velocidade, use o-prune
seguinte:fonte
-print
no final! Além disso, não tenho certeza se-name '\.*' would be more efficient instead of
-path` (porque o caminho é pesquisar subcaminhos, mas estes serão podadas para fora).
desse contexto?find
significa o diretório atual:find
examinará todos os arquivos e diretórios no diretório atual. O argumento a seguirpath
é uma expressão regular, em que um ponto normalmente significa "qualquer caractere". Para fazer com que ele signifique um ponto literal, precisamos escapar com uma barra invertida. O argumento depois-name
não é uma expressão regular, mas expande curingas como?
e*
como um shell..
ter um significado especial..
. Tanto quanto eu estou ciente, apenas estes devem ser precedidos:*
,?
, e[]
.Este é um dos poucos meios de excluir arquivos de ponto que também funcionam corretamente no BSD, Mac e Linux:
$PWD
imprima o caminho completo no diretório atual para que o caminho não comece com./
-name ".*" -prune
corresponde a qualquer arquivo ou diretório que comece com um ponto e não desça-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.fonte
-o ... -print
é útil. Para meu uso, agora tenhofind ... '!' -name . -name '.*' -prune -o ... -print
, o que era mais conveniente do que incluir $ PWD.Exclui todos os diretórios ocultos e arquivos ocultos em $ DIR
fonte
A resposta que originalmente publiquei como uma "edição" para minha pergunta original acima:
find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
, trabalho. O regex procura por "qualquer coisa, depois uma barra, depois um ponto e depois qualquer coisa" (ou seja, todos os arquivos e pastas ocultos, incluindo suas subpastas) e o "!" nega o regex.fonte
find . \( ! -regex './\..*' \) -type f -maxdepth 1 -print
Você não precisa usar
find
para isso. Basta usar o globstar no shell ele mesmo, como:ou:
onde
**/
representa qualquer pasta recursivamente e*foo*
qualquer arquivo que tenhafoo
seu nome.Por padrão, o uso
ls
imprimirá nomes de arquivos, excluindo arquivos e diretórios ocultos.Se você não tem o globbing ativado, faça isso por
shopt -s globstar
.Nota: Uma nova opção de globbing funciona no Bash 4, zsh e shells semelhantes.
Exemplo:
fonte
ls
disso!echo **/*foo*
/
significa pasta, separa os diretórios do nome do arquivo.*
basicamente representa tudo.A resposta do @ Flimm é boa, principalmente porque impede que a busca desça para diretórios ocultos . Eu prefiro esta simplificação:
Geralmente para excluir todos os caminhos ocultos (arquivos regulares, diretórios etc.):
Por exemplo, usando seu diretório de trabalho como ponto de partida e
-name '*some text*'
como a expressão:Em contraste com o que a resposta de @ Flimm sugere, nenhum arquivo ou diretório oculto é o caso simples. A
-path '*/.*'
expressão é verdadeira para qualquer caminho (arquivos regulares, diretórios, etc) que tenha um.
imediatamente após o separador de arquivos/
,. Portanto, essa linha remove arquivos e diretórios ocultos.Permitir arquivos ocultos enquanto exclui diretórios ocultos é o caso que requer um filtro adicional. É aqui que você incluiria
-type d
na expressão sendo removida.Por exemplo:
Nesse caso,
-type d -path '*/.*'
étrue
apenas para diretórios e, portanto, apenas os diretórios são removidos.fonte
find
possui opções lógicas simples, como-and
e-not
você pode usá-las para sua vantagem, para encontrar um arquivo correspondente com duas regras como esta:Como você pode ver,
find
usa duas regras-name '*hidden_file*'
e-and \( -not -name ".*" \)
encontra os nomes de arquivos que correspondem às duas condições - o nome do arquivohidden_file
, mas sem o ponto inicial. Observe as barras na frente de parênteses - elas são usadas para definir parênteses comofind
argumentos, em vez de definir um subshell (que é o que parênteses significa de outra forma sem barras)fonte
Notas:
.
: pasta atual-maxdepth 1
para pesquisar recursivamente-type f
: encontre arquivos, não diretórios (d
)-not -path '*/\.*'
: não retorne.hidden_files
sed 's/^\.\///g'
: remova o anexo./
da lista de resultadosfonte