Trova un file per nome usando la riga di comando

140

Vorrei determinare la posizione di un file utilizzando 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, fornito il suo nome?

    
posta Sam007 31.05.2012 - 19:02

8 risposte

172

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

Utilizzando . cercherà solo la directory corrente. ~/ cercherà la tua intera home directory (probabilmente dove l'hai scaricata). Se hai utilizzato wget come root, è possibile che sia altrove, quindi potresti utilizzare / per cercare nell'intero file system.

Goodluck

    
risposta data adempewolff 31.05.2012 - 19:06
28

Vorrei provare:

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

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

La tua sintassi per locate è corretta, ma potresti dover eseguire

sudo updatedb

prima. Per qualche ragione, non ho mai avuto fortuna con locate però.

locate utilizza il database di file e directory creati da updatedb . Quindi se hai scaricato un nuovo file ci sono più possibilità che il tuo updatedb non abbia aggiornato il database di file e directory. Puoi usare sudo updatedb prima di usare locate programma di utilità. updatedb generalmente viene eseguito una volta al giorno da solo sui sistemi linux.

    
risposta data reverendj1 31.05.2012 - 19:12
11

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

Prova find . -type d | grep DIRNAME

    
risposta data Mitch 31.05.2012 - 19:11
5

Le altre risposte sono buone, ma trovo che omettere le dichiarazioni Permission denied mi dà risposte più chiare (omette stderr s a causa di non eseguire sudo ):

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

dove:

  • / può essere sostituito con la directory in cui vuoi iniziare la ricerca da
  • f può essere sostituito con d se stai cercando una directory invece di un file
  • -iname può essere sostituito con -name se si desidera che la ricerca sia sensibile al maiuscolo e minuscolo
  • il * s nel termine di ricerca può essere omesso se non vuoi 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. % Co_de%

    
risposta data zanbri 29.07.2016 - 17:35
2

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. il -f dice ad albero di dare il percorso completo al file. dal momento che non abbiamo idea della sua posizione o posizione genitore, buona ricerca dalla radice del filesystem / ricorsivamente verso il basso. Quindi inviamo l'output a grep per evidenziare la nostra parola, postgis-2.0.0

    
risposta data ptetteh227 18.11.2017 - 04:16
1

Prova find . -name "*file_name*"

  • dove puoi cambiare "." (guarda nella directory corrente) su "/" (guarda nell'intero sistema) o "~ /" (guarda nella Home directory).

  • in cui puoi cambiare "-name" in "-iname" se non desideri distinguere tra maiuscole e minuscole.

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

risposta data RuiVBoas 13.03.2017 - 11:05
0

$ find . -type f | grep IMG_20171225_*

./03-05--2018/IMG_20171225_200513.jpg
Il DOT dopo il comando find deve indicare un punto di partenza,
Quindi, la cartella corrente,
"piped" (= filtrato) tramite il filtro del nome IMG_20171225_*

    
risposta data 08.09.2018 - 10:38
0

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

bash

bash ha un'opzione di shell globstar molto carina, 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 attraversamenti ricorsivi dell'albero delle directory e tramite subroutine eseguire azioni specifiche su di essi. Con un piccolo script, puoi attraversare l'albero delle directory, spingere i file che contengono la stringa desiderata nell'array e quindi stamparlo 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

Python

Python è un altro linguaggio di scripting che è ampiamente utilizzato nel mondo di Ubuntu. In particolare, ha il modulo os.walk() che ci permette di eseguire la stessa azione di sopra - attraversa l'albero delle directory e ottenere l'elenco dei 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 dovrebbe essere così:

#!/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))
    
risposta data Sergiy Kolodyazhnyy 13.07.2017 - 04:23

Leggi altre domande sui tag