Encontre um arquivo pelo nome usando a linha de comando

117

Eu gostaria de determinar a localização de um arquivo usando a linha de comando. Eu tentei:

find . -type f -name "postgis-2.0.0"

e

locate postgis-2.0.0

sem sucesso. Qual é o comando para determinar o diretório do arquivo, desde o seu nome?

    
por Sam007 31.05.2012 / 19:02

7 respostas

144

Experimente find ~/ -type f -name "postgis-2.0.0" .

Usar . pesquisará somente o diretório atual. ~/ pesquisará todo o seu diretório pessoal (provavelmente onde você fez o download). Se você usou wget como root, é possível que ele esteja em outro lugar, então você pode usar / para pesquisar todo o sistema de arquivos.

Goodluck

    
por adempewolff 31.05.2012 / 19:06
27

Eu tentaria:

sudo find / -type d -name "postgis-2.0.0"

significa procurar apenas no diretório atual, é melhor pesquisar tudo, desde root, se você realmente não sabe. Além disso, digite -f significa procurar arquivos, não pastas. Adicionar sudo permite pesquisar em todas as pastas / subpastas.

Sua sintaxe para locate está correta, mas você pode ter que executar

sudo updatedb

primeiro. Por qualquer motivo, eu nunca tenho boa sorte com locate .

locate usa banco de dados de arquivos e diretórios feitos por updatedb . Portanto, se você fez o download de um novo arquivo, há mais chances de que seu updatedb não tenha atualizado o banco de dados de arquivos e diretórios. Você pode usar sudo updatedb antes de usar o programa utilitário locate . updatedb geralmente é executado uma vez por dia sozinho nos sistemas linux.

    
por reverendj1 31.05.2012 / 19:12
10

find é uma das ferramentas Linux / Unix mais úteis.

Experimente find . -type d | grep DIRNAME

    
por Mitch 31.05.2012 / 19:11
2

Isso deve simplificar a localização do arquivo:

Isso lhe daria o caminho completo para o arquivo

tree -f  / | grep postgis-2.0.0

Árvore lista o conteúdo dos diretórios em um formato de árvore. o -f diz à árvore para fornecer o caminho completo para o arquivo. desde que nós não temos nenhuma idéia de sua localização ou localização de pai, bom para procurar da raiz do sistema de arquivos / recursivamente para baixo. Em seguida, enviamos a saída para grep para destacar nossa palavra, postgis-2.0.0

    
por ptetteh227 18.11.2017 / 04:16
1

Experimente find . -name "*file_name*"

  • onde você pode alterar '.' (procure no diretório atual) para '/' (procure em todo o sistema) ou '~ /' (examine o diretório pessoal).

  • onde você pode alterar "-nome" para "-inome" se não quiser distinção entre maiúsculas e minúsculas.

  • onde você pode alterar " nome_do_arquivo " (um arquivo que pode iniciar e terminar com o que estiver) para o nome exato do arquivo.

por RuiVBoas 13.03.2017 / 11:05
1

As outras respostas são boas, mas eu acho omitir Permission denied declarações me dá respostas mais claras (omite stderr s devido a não correr sudo ):

find / -type f -iname "*postgis-2.0.0*" 2>/dev/null

onde:

  • / pode ser substituído pelo diretório em que você deseja iniciar sua pesquisa
  • f pode ser substituído por d se você estiver procurando por um diretório em vez de um arquivo
  • -iname pode ser substituído por -name se você quiser que a pesquisa seja sensível a maiúsculas
  • o * s no termo de pesquisa pode ser omitido se você não quiser os curingas na pesquisa

Uma alternativa é:

find / -type f 2>/dev/null | grep "postgis-2.0.0"

Dessa forma, os resultados retornarão se o termo de pesquisa corresponder a qualquer lugar no caminho completo do arquivo, por exemplo, /home/postgis-2.0.0/docs/Readme.txt

    
por zanbri 29.07.2016 / 17:35
0

Embora o comando find seja a maneira mais simples de percorrer recursivamente a árvore de diretórios, há outras maneiras e, em particular, as duas linguagens de script que vêm com o Ubuntu, por padrão, já têm a capacidade de fazê-lo.

bash

bash tem uma opção globstar shell muito agradável, que permite a travessia recursiva da árvore de diretórios. Tudo o que precisamos fazer é testar se o item na expansão ./**/* é um arquivo e se contém o texto desejado:

bash-4.3$ for f in ./**/* ;do [ -f "$f" ] && [[ "$f" =~ "postgis-2.0.0" ]] && echo "$f"; done 
./testdir/texts/postgis-2.0.0

Perl

O Perl possui o módulo Find, que permite realizar a travessia recursiva da árvore de diretórios e, através da sub-rotina, realizar ações específicas sobre eles. Com um pequeno script, você pode percorrer a árvore de diretórios, enviar arquivos que contêm a string desejada para a matriz e imprimi-lo da seguinte forma:

#!/usr/bin/env perl
use strict;
use warnings;
use File::Find;

my @wanted_files;
find(
     sub{ 
         -f $_ && $_ =~ $ARGV[0]  
               && push @wanted_files,$File::Find::name
     }, "."
);

foreach(@wanted_files){
    print "$_\n"
}

E como funciona:

$ ./find_file.pl  "postgis-2.0.0"                                                       
./testdir/texts/postgis-2.0.0

Python

O Python é outra linguagem de script que é usada amplamente no mundo do Ubuntu. Em particular, ele tem os.walk() module que nos permite executar a mesma ação como acima - percorrer a árvore de diretórios e obter uma lista de arquivos que contenham a string desejada.

Como uma linha, isso pode ser feito da seguinte forma:

$ python -c 'import os;print([os.path.join(r,i) for r,s,f in os.walk(".") for i in f if "postgis-2.0.0" in i])'                                                                         
['./testdir/texts/postgis-2.0.0']

O script completo ficaria assim:

#!/usr/bin/env python
import os;

for r,s,f in os.walk("."):
    for i in f:
        if "postgis-2.0.0" in i:
            print(os.path.join(r,i))
    
por Sergiy Kolodyazhnyy 13.07.2017 / 04:23