Encontre um arquivo pelo nome usando a linha de comando

183

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

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

Sam007
fonte
2
o locatecomando está bem, apenas atualizar o locatedb primeiro, usando o comandoupdatedb
thucnguyen
Se já estiver instalado, o novo nome do arquivo pode não ser postgis-2.0.0mais. Geralmente, depois das instalações via gerenciadores de pacotes, os executáveis ​​ficam em uma das $PATHpastas e tentam which postgisver o local. Se não retornar nada, somente então você deverá procurar manualmente o local do arquivo.
Sdkks

Respostas:

232

Tente em find ~/ -type f -name "postgis-2.0.0"vez disso.

O uso .pesquisará apenas o diretório atual. ~/pesquisará todo o diretório pessoal (provavelmente para onde você o baixou). Se você usou wgetcomo root, é possível que esteja em outro lugar, para que você possa /pesquisar todo o sistema de arquivos.

Boa sorte

adempewolff
fonte
1
oh ya i usado wgetcomo root assim /funcionou graças
Sam007
para obter mais informações, consulte este link help.ubuntu.com/community/find
habibun
Eu encontro: / Users / UserName // Biblioteca / Estado do aplicativo salvo / com.bitrock.appinstaller.savedState: Erro de permissão negada. aparece em todas as execuções do comando. Como se livrar dele?
Eduard
29

Eu tentaria:

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

O . significa pesquisar apenas no diretório atual; é melhor pesquisar tudo desde o raiz, se você realmente não souber. Além disso, digite -f significa procurar arquivos, não pastas. A adição sudopermite pesquisar em todas as pastas / subpastas.

Sua sintaxe para locateestá correta, mas talvez você precise executar

sudo updatedb

primeiro. Por alguma razão, eu nunca tenho boa sorte com isso locate.

locateusa banco de dados de arquivos e diretórios criados por updatedb. Portanto, se você baixou um novo arquivo, há mais chances de o seu updatedbnão atualizar o banco de dados de arquivos e diretórios. Você pode usar sudo updatedbantes de usar o locateprograma utilitário. updatedbgeralmente roda uma vez por dia sozinho em sistemas linux.

reverendj1
fonte
14

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

Experimentar find . -type d | grep DIRNAME

Mitch
fonte
Existe alguma vantagem aqui em usar grep over -name?
TryHarder
@oooooo eu adicionei uma razão na minha resposta abaixo
zanbri
encontrar mais grep era a única coisa que funcionou para mim
malhal
12

As outras respostas são boas, mas acho que omitir Permission denieddeclarações fornece respostas mais claras (omite stderrs devido à não execução 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
  • fpode ser substituído por dse você estiver procurando por um diretório em vez de um arquivo
  • -inamepode ser substituído por -namese você deseja que a pesquisa faça distinção entre maiúsculas e minúsculas
  • os *s no termo de pesquisa podem ser omitidos se você não desejar os curingas na pesquisa

Uma alternativa é:

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

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

zanbri
fonte
2
Existem -regexe -iregexopções para pesquisar Regular Expressions, que também encontrariam o caminho. A sugestão de encontrar qualquer item que seja um arquivo ( -type f) grepé mais caro em termos de recursos. Permission deniedacontece quando o usuário não tem acesso a arquivos ou pastas, o uso de sudobefore find permitirá encontrar todos os arquivos.
Sdkks
1
É bom saber sobre as opções de regex, obrigado.
21416 zanbri
@zanbri Use -wholenameou em -iwholenamevez de canalizar para grep.
Wjandrea
4

Experimentar find . -name "*file_name*"

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

  • onde você pode alterar "-name" para "-iname" se não desejar distinção entre maiúsculas e minúsculas.

  • onde você pode alterar " file_name " (um arquivo que pode começar e terminar com o que quer que seja) para o nome exato do arquivo.

RuiVBoas
fonte
3

Isso deve simplificar a localização do arquivo:

Isso 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. a -fárvore diz para fornecer o caminho completo para o arquivo. como não temos idéia de sua localização ou localização pai, é bom pesquisar a partir 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

ptetteh227
fonte
0

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

bater

bash possui uma globstaropção muito boa de shell, 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, executar ações específicas sobre eles. Com um pequeno script, você pode percorrer a árvore de diretórios, enviar arquivos que contêm a sequência desejada para a matriz e imprimi-la da seguinte maneira:

#!/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

Pitão

Python é outra linguagem de script usada amplamente no mundo do Ubuntu. Em particular, ele possui um os.walk()módulo que nos permite executar a mesma ação que a árvore de diretórios acima - atravessar e obter a lista de arquivos que contêm a sequência desejada.

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

$ 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))
Sergiy Kolodyazhnyy
fonte
0

$ find . -type f | grep IMG_20171225_*
Fornece ao
./03-05--2018/IMG_20171225_200513.jpg
DOT após o comando finddeclarar um ponto de partida.
Portanto , a pasta atual
"canalizada" (= filtrada) através do filtro de nomeIMG_20171225_*

Jadeye
fonte