Trova un file per nome utilizzando la riga di comando


183

Vorrei determinare la posizione di un file usando la riga di comando. Ho provato:

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

e

locate postgis-2.0.0

inutilmente. Qual è il comando per determinare la directory del file, a condizione che si chiami?


2
il locatecomando va bene, aggiorna prima il foundb, usando il comandoupdatedb
thucnguyen,

Se è già installato, il nuovo nome file potrebbe non essere postgis-2.0.0più. Di solito dopo l'installazione tramite gestori pacchetti, gli eseguibili si trovano in una delle $PATHcartelle, provano which postgisa vedere la posizione. Se non restituisce nulla, solo allora dovresti cercare manualmente il percorso del file.
sdkks,

Risposte:


232

Prova find ~/ -type f -name "postgis-2.0.0"invece.

Usando .cercherà solo la directory corrente. ~/cercherà l'intera home directory (probabilmente dove l'hai scaricata). Se hai usato wgetcome root, è possibile che potrebbe essere da qualche altra parte in modo da poter /cercare nell'intero filesystem.

In bocca al lupo


1
oh ya ho usato wgetcome root, quindi ha /funzionato grazie
Sam007

per ulteriori informazioni, consultare questo link help.ubuntu.com/community/find
habibun

Ottengo trovare: / Users / UserName // Library / Saved Application State / com.bitrock.appinstaller.savedState: errore autorizzazione negata. appare ad ogni esecuzione del comando. Come sbarazzarsene?
Eduard,

29

Proverei:

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

Il . significa cercare solo nella directory corrente, è meglio cercare tutto da root se davvero non lo sai. Inoltre, digitare -f significa cercare file, non cartelle. L'aggiunta sudoconsente di cercare in tutte le cartelle / sottocartelle.

La sintassi per locateè corretta, ma potrebbe essere necessario eseguire

sudo updatedb

primo. Per qualsiasi motivo, comunque, non ho mai avuto fortuna locate.

locateutilizza un database di file e directory creato da updatedb. Quindi, se hai scaricato un nuovo file, ci sono maggiori possibilità che tu updatedbnon abbia aggiornato il database di file e directory. È possibile utilizzare sudo updatedbprima di utilizzare il locateprogramma di utilità. updatedbgeneralmente viene eseguito una volta al giorno da solo sui sistemi Linux.


14

find è uno degli strumenti Linux / Unix più utili.

Provare find . -type d | grep DIRNAME


C'è qualche vantaggio qui nell'usare grep over -name?
TryHarder

@oooooo Ho aggiunto un motivo nella mia risposta di seguito
zanbri,

find plus grep è stata l'unica cosa che ha funzionato per me
malhal

12

Le altre risposte sono buone, ma trovo che omettere le Permission deniedistruzioni mi dia risposte più chiare (omette stderrs a causa di non essere in esecuzione sudo):

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

dove:

  • / può essere sostituito con la directory da cui si desidera iniziare la ricerca
  • fpuò essere sostituito con dse stai cercando una directory anziché un file
  • -inamepuò essere sostituito con -namese si desidera che la ricerca faccia distinzione tra maiuscole e minuscole
  • le *s nel termine di ricerca possono essere omesse se non si vogliono i caratteri jolly nella ricerca

Un'alternativa è:

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

In questo modo restituisce risultati se il termine di ricerca corrisponde ovunque nel percorso completo del file, ad es /home/postgis-2.0.0/docs/Readme.txt


2
Ci sono -regexe -iregexinterruttori per la ricerca Regular Expressions, che troverebbero anche il percorso menzionato. Suggerimento di trovare qualsiasi elemento che sia un file ( -type f) quindi grepè più costoso delle risorse. Permission deniedsi verifica quando l'utente non ha accesso a file o cartelle, l'utilizzo sudoprima di find consentirà a find di vedere tutti i file.
sdkks,

1
Buono a sapersi sugli switch regex, grazie.
zanbri,

@zanbri Utilizzare -wholenameo -iwholenameinvece di eseguire il piping a grep.
wjandrea,

4

Provare find . -name "*file_name*"

  • dove puoi cambiare '.' (guarda nella Directory corrente) in '/' (guarda in tutto il sistema) o '~ /' (guarda nella Directory Home).

  • dove è possibile modificare "-name" in "-iname" se non si desidera la distinzione tra maiuscole e minuscole.

  • dove puoi cambiare " nome_file " (un file che può iniziare e terminare con qualunque cosa sia) con il nome esatto del file.


3

Questo dovrebbe semplificare la localizzazione del file:

Questo ti darebbe il percorso completo del file

tree -f  / | grep postgis-2.0.0

Albero elenca i contenuti delle directory in un formato ad albero. l' -falbero dice a dare il percorso completo al file. dal momento che non abbiamo idea della sua posizione o della posizione principale, è bene cercare /ricorsivamente dalla radice del filesystem verso il basso. Quindi inviamo l'output a grep per evidenziare la nostra parola,postgis-2.0.0


0

Mentre il findcomando è il modo più semplice per attraversare ricorsivamente l'albero delle directory, ci sono altri modi e in particolare i due linguaggi di scripting forniti di default con Ubuntu hanno già la possibilità di farlo.

bash

bash ha globstarun'opzione shell molto bella , che consente l'attraversamento ricorsivo dell'albero delle directory. Tutto ciò che dobbiamo fare è verificare se l'elemento ./**/*nell'espansione è un file e se contiene il testo desiderato:

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

Perl

Perl ha il modulo Trova, che consente di eseguire l'attraversamento ricorsivo dell'albero delle directory e, tramite subroutine, di eseguire azioni specifiche su di essi. Con un piccolo script, è possibile attraversare l'albero delle directory, inserire nell'array i file che contengono la stringa desiderata e quindi stamparla in questo modo:

#!/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 come funziona:

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

Pitone

Python è un altro linguaggio di scripting molto utilizzato nel mondo di Ubuntu. In particolare, ha un os.walk()modulo che ci consente di eseguire la stessa azione sopra - attraversare l'albero delle directory e ottenere un elenco di file che contengono la stringa desiderata.

Come one-liner questo può essere fatto in questo modo:

$ 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']

Lo script completo sarebbe simile al seguente:

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

0

$ find . -type f | grep IMG_20171225_*
Fornisce
./03-05--2018/IMG_20171225_200513.jpg
il DOT dopo il comando findè di indicare un punto iniziale,
quindi - la cartella corrente,
"convogliata" (= filtrata) attraverso il filtro nomeIMG_20171225_*

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.