Suchen Sie eine Datei mit dem Namen über die Befehlszeile


182

Ich möchte den Speicherort einer Datei über die Befehlszeile ermitteln. Ich habe versucht:

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

und

locate postgis-2.0.0

umsonst. Wie lautet der Befehl zum Ermitteln des Verzeichnisses der Datei unter Angabe des Namens?


2
der locatebefehl ist in ordnung, aktualisiere einfach zuerst den lokalisierten b mit befehlupdatedb
thucnguyen

Wenn es bereits installiert ist, ist der neue Dateiname möglicherweise nicht postgis-2.0.0mehr vorhanden. In der Regel befinden sich die ausführbaren Dateien nach der Installation über Paketmanager in einem der $PATHOrdner. Versuchen Sie which postgis, den Speicherort zu ermitteln. Wenn es nichts zurückgibt, sollten Sie nur manuell nach dem Speicherort der Datei suchen.
SDKKS

Antworten:


231

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

Mit .wird nur das aktuelle Verzeichnis durchsucht. ~/durchsucht Ihr gesamtes Home-Verzeichnis (wahrscheinlich dort, wo Sie es heruntergeladen haben). Wenn Sie wgetals root verwendet haben, ist es möglich, dass es sich um eine andere Stelle handelt, mit der Sie /das gesamte Dateisystem durchsuchen können.

Viel Glück


1
oh ya ich wgetals root verwendet, so /funktioniert danke
Sam007


Ich erhalte den folgenden Befehl: / Users / UserName // Library / Saved Application State / com.bitrock.appinstaller.savedState: Fehler "Berechtigung verweigert". Es erscheint bei jeder Ausführung des Befehls. Wie kann man es loswerden?
Eduard

29

Ich würde versuchen:

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

Das . Wenn Sie nur im aktuellen Verzeichnis suchen, ist es am besten, alles von root aus zu durchsuchen, wenn Sie es wirklich nicht wissen. Außerdem bedeutet Typ -f, dass nach Dateien und nicht nach Ordnern gesucht wird. Durch Hinzufügen sudokann in allen Ordnern / Unterordnern gesucht werden.

Ihre Syntax für locateist korrekt, aber Sie müssen möglicherweise ausführen

sudo updatedb

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

locateVerwendet eine Datenbank mit Dateien und Verzeichnissen von updatedb. Wenn Sie also eine neue Datei heruntergeladen haben, besteht eine höhere Wahrscheinlichkeit, dass Sie updatedbdie Datenbank mit Dateien und Verzeichnissen nicht aktualisiert haben. Sie können verwenden, sudo updatedbbevor Sie das locateHilfsprogramm verwenden. updatedbLäuft in der Regel einmal am Tag von selbst auf Linux-Systemen.


14

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

Versuchen find . -type d | grep DIRNAME


Hat die Verwendung von grep over-name hier einen Vorteil?
TryHarder

@oooooo Ich fügte einen Grund in meine Antwort unten
zanbri

find plus grep war das einzige, was bei mir funktioniert hat
malhal

12

Die anderen Antworten sind gut, aber ich finde, dass das Auslassen von Permission deniedAussagen mir klarere Antworten gibt ( Auslassungen, stderrweil ich nicht laufe sudo):

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

wo:

  • / kann durch das Verzeichnis ersetzt werden, von dem aus Sie Ihre Suche starten möchten
  • fkann durch ersetzt werden, dwenn Sie nach einem Verzeichnis anstelle einer Datei suchen
  • -inamekann durch ersetzt werden, -namewenn bei der Suche zwischen Groß- und Kleinschreibung unterschieden werden soll
  • Das *s im Suchbegriff kann weggelassen werden, wenn die Platzhalter in der Suche nicht verwendet werden sollen

Eine Alternative ist:

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

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


2
Es gibt -regexund -iregexSchalter zum Suchen mit Regular Expressionsdenen der Pfad auch Erwähnungen findet. Der Vorschlag, ein Element zu finden, bei dem es sich um eine Datei ( -type f) handelt, grepist ressourcenintensiver. Permission deniedTritt auf, wenn der Benutzer keinen Zugriff auf Dateien oder Ordner hat. Wenn Sie " sudoVorher suchen" verwenden, kann "Suchen" alle Dateien anzeigen.
SDKKS

1
Gut zu wissen, über die Regex-Schalter, danke.
Zanbri

@zanbri Verwenden Sie -wholenameoder -iwholenameanstelle von Piping to grep.
wjandrea

4

Versuchen find . -name "*file_name*"

  • Hier können Sie '.' (in das aktuelle Verzeichnis schauen) in '/' (in das gesamte System schauen) oder '~ /' (in das Home-Verzeichnis schauen) ändern.

  • Hier können Sie "-name" in "-iname" ändern, wenn Sie nicht zwischen Groß- und Kleinschreibung unterscheiden möchten.

  • Hier können Sie " Dateiname " (eine Datei, die mit jedem beliebigen Namen beginnen und enden kann) in den genauen Namen der Datei ändern .


3

Dies sollte das Auffinden der Datei vereinfachen:

Auf diese Weise erhalten Sie den vollständigen Pfad zur Datei

tree -f  / | grep postgis-2.0.0

Baum listet den Inhalt von Verzeichnissen in einem baumartigen Format auf. Der -fBefehlsbaum gibt den vollständigen Pfad zur Datei an. Da wir keine Ahnung von seinem Speicherort oder übergeordneten Speicherort haben, empfiehlt es sich, vom Dateisystemstamm /rekursiv nach unten zu suchen . Wir senden dann die Ausgabe an grep, um unser Wort hervorzuheben.postgis-2.0.0


0

Während der findBefehl die einfachste Möglichkeit ist, den Verzeichnisbaum rekursiv zu durchlaufen, gibt es andere Möglichkeiten, und insbesondere die beiden Skriptsprachen, die standardmäßig in Ubuntu enthalten sind, können dies bereits.

Bash

bash hat eine sehr schöne globstarShell-Option, die das rekursive Durchlaufen des Verzeichnisbaums ermöglicht. Wir müssen nur testen, ob es sich bei dem Element in der ./**/*Erweiterung um eine Datei handelt und ob es 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 Suchmodul, mit dem der Verzeichnisbaum rekursiv durchsucht und über eine Unterroutine bestimmte Aktionen ausgeführt werden können. Mit einem kleinen Skript können Sie den Verzeichnisbaum durchlaufen, 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 so geht's:

$ ./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 verbreitet ist. Insbesondere verfügt es über ein os.walk()Modul, mit dem wir die gleiche Aktion wie oben ausführen können - Verzeichnisbaum durchlaufen und eine Liste der Dateien abrufen, die die gewünschte Zeichenfolge enthalten.

Als Einzeiler kann dies folgendermaßen erfolgen:

$ 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 folgendermaßen 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

$ find . -type f | grep IMG_20171225_*
Gibt
./03-05--2018/IMG_20171225_200513.jpg
das DOT nach dem Befehl findan, einen Startpunkt anzugeben,
also den aktuellen Ordner, der
durch den Namensfilter "geleitet" (= gefiltert) wirdIMG_20171225_*

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.