Frage Suchen Sie eine Datei anhand des Namens mithilfe der Befehlszeile


Ich möchte den Speicherort einer Datei mithilfe der Befehlszeile ermitteln. Ich habe versucht:

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

und

locate postgis-2.0.0

umsonst. Was ist der Befehl, um das Verzeichnis der Datei zu bestimmen, vorausgesetzt, ihr Name?


125
2018-05-31 17:02


Ursprung


das locate Befehl ist in Ordnung, aktualisieren Sie nur die lokalisierteB zuerst, Befehl verwenden updatedb - thucnguyen
Wenn es bereits installiert ist, ist der neue Dateiname möglicherweise nicht vorhanden postgis-2.0.0 nicht mehr. In der Regel befinden sich nach Installationen über Paketmanager ausführbare Dateien in einem der $PATH Ordner, versuche es which postgis um den Standort zu sehen. Wenn es nichts zurückgibt, dann sollten Sie manuell nach dem Speicherort der Datei suchen. - sdkks


Antworten:


Versuchen find ~/ -type f -name "postgis-2.0.0" stattdessen.

Verwenden . Durchsucht nur das aktuelle Verzeichnis. ~/ Durchsucht Ihr gesamtes Home-Verzeichnis (wahrscheinlich wo Sie es heruntergeladen haben). Wenn du benutzt hast wget als root, es ist möglich, dass es woanders sein könnte, damit du es benutzen kannst / um das gesamte Dateisystem zu durchsuchen.

Viel Glück


154
2018-05-31 17:06



Oh, ich habe es benutzt wget als root also / Danke gearbeitet - Sam007
für mehr überprüfen Sie diesen Link help.ubuntu.com/community/find - habibun
Ich bekomme find: / Users / UserName // Bibliothek / Gespeicherter Anwendungsstatus / com.bitrock.appinstaller.savedState: Berechtigungsverweigerungsfehler. Es erscheint bei jeder Ausführung des Befehls. Wie man es los wird? - Eduard


Ich würde versuchen:

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

Das . bedeutet Suche nur im aktuellen Verzeichnis, es ist am besten, alles von Root zu suchen, wenn Sie wirklich nicht wissen. Außerdem geben Sie mit -f die Suche nach Dateien und nicht nach Ordnern ein. Hinzufügen sudo erlaubt es in allen Ordnern / Unterordnern zu suchen.

Ihre Syntax für locate ist richtig, aber Sie müssen möglicherweise laufen

sudo updatedb

zuerst. Aus welchem ​​Grund auch immer, ich habe nie Glück mit locate obwohl.

locate verwendet Datenbank von Dateien und Verzeichnissen von updatedb. Also, wenn Sie eine neue Datei heruntergeladen haben, besteht eine größere Chance, dass Sie updatedb hat die Datenbank von Dateien und Verzeichnissen nicht aktualisiert. Sie können verwenden sudo updatedb vor Gebrauch locate Dienstprogramm. updatedb läuft in der Regel einmal am Tag auf Linux-Systemen.


28
2018-05-31 17:12





find ist eines der nützlichsten Linux / Unix-Tools.

Versuchen find . -type d | grep DIRNAME


11
2018-05-31 17:11



Hat grep over -name hier einen Vorteil? - TryHarder
@oooooo Ich habe einen Grund in meiner Antwort unten hinzugefügt - zanbri
find plus grep war das einzige was für mich funktionierte - malhal


Die anderen Antworten sind gut, aber ich finde es unterlassen Permission denied Aussagen gibt mir klarere Antworten (Auslassungen stderrs wegen nicht laufen sudo):

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

woher:

  • / kann durch das Verzeichnis ersetzt werden, mit dem Sie Ihre Suche starten möchten
  • f kann mit ersetzt werden d wenn Sie nach einem Verzeichnis statt einer Datei suchen
  • -iname kann mit ersetzt werden -name Wenn Sie möchten, dass die Suche die Groß- und Kleinschreibung berücksichtigt
  • das *s im Suchbegriff kann weggelassen werden, wenn die Platzhalter bei der Suche nicht gewünscht sind

Eine Alternative ist:

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

Auf diese Weise werden Ergebnisse zurückgegeben, wenn der Suchbegriff im gesamten Dateipfad übereinstimmt, z. /home/postgis-2.0.0/docs/Readme.txt


2
2017-07-29 15:35



Es gibt -regex und -iregex Schalter zum Suchen mit Regular Expressions, die den Pfad finden würde, erwähnt auch. Vorschlag, einen Gegenstand zu finden, der eine Datei ist (-type f) dann grep ist mehr Ressourcen teuer. Permission denied passiert, wenn der Benutzer keinen Zugriff auf Dateien oder Ordner hat sudo vor dem Finden wird es erlauben, alle Dateien zu finden. - sdkks
Gut zu wissen über die Regex-Schalter, danke. - zanbri
@zanbri Verwendung -wholename oder -iwholename anstatt zu pumpen grep. - wjandrea


Dies sollte das Auffinden von Dateien vereinfachen:

Dadurch erhalten Sie den vollständigen Pfad zur Datei

tree -f  / | grep postgis-2.0.0

Baum listet den Inhalt von Verzeichnissen in einem baumähnlichen Format auf. das -f weist Baum an, den vollständigen Pfad zur Datei anzugeben. Da wir keine Ahnung von seiner Position oder seinem übergeordneten Speicherort haben, ist es gut, nach dem Root des Dateisystems zu suchen / rekursiv nach unten. Wir senden dann die Ausgabe nach Grep, um unser Wort hervorzuheben, postgis-2.0.0 


2
2017-11-18 03:16





Versuchen find . -name "*file_name*"

  • Hier kannst du '.' (schaue in das Current Directory) auf '/' (schau in das gesamte System) oder '~ /' (schau in das Home Directory) wechseln.

  • Hier können Sie "-name" in "-iname" ändern, wenn Sie keine Groß- / Kleinschreibung beachten möchten.

  • wo du dich ändern kannst "Dateiname"(Eine Datei, die mit dem beginnen und enden kann, was immer es ist), zum genauen Namen der Datei.


1
2018-03-13 10:05





Während find Befehl ist der einfachste Weg, die Verzeichnisstruktur rekursiv zu durchlaufen, es gibt andere Möglichkeiten und insbesondere die beiden Skriptsprachen, die standardmäßig mit Ubuntu geliefert werden, sind bereits dazu in der Lage.

bash

bash  hat ein sehr schönes globstar Shell-Option, die das rekursive Traversieren des Verzeichnisbaums ermöglicht. Alles, was wir tun müssen, ist zu prüfen, ob Artikel in der ./**/* Erweiterung ist eine Datei und ob sie den gewünschten Text enthält:

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 verfügt über das Modul Suchen, mit dem rekursives Traversieren des Verzeichnisbaums ausgeführt werden kann und über das Unterprogramm eine bestimmte Aktion ausgeführt werden kann. Mit einem kleinen Skript können Sie die Verzeichnisstruktur durchqueren, Dateien, die die gewünschte Zeichenfolge enthalten, in ein Array verschieben und dann wie folgt drucken:

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

Und wie es funktioniert:

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

Python

Python ist eine weitere Skriptsprache, die in der Ubuntu-Welt sehr weit verbreitet ist. Insbesondere hat es os.walk() Modul, mit dem wir die gleiche Aktion wie oben ausführen können - durchlaufen Verzeichnisbaum und erhalten Liste der Dateien, die gewünschte Zeichenfolge enthalten.

Als One-Liner kann dies so gemacht werden:

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

Das vollständige Skript würde so aussehen:

#!/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
2017-07-13 02:23