Holen Sie sich den absoluten Pfad der Dateien mit dem Befehl 'find'

25

Gibt es eine Möglichkeit, den absoluten Pfad einer zu durchsuchenden Datei abzurufen?

Beispielsweise:

find .. -name "filename"

Es gibt mir Ergebnisse wie, ../filenameaber ich möchte den vollständigen Pfad.

Ich muss im übergeordneten Verzeichnis und seinen untergeordneten Verzeichnissen nach einer bestimmten Datei suchen, die ich später in einem anderen Skript verwenden werde.

Vielen Dank

JorgeeFG
quelle
1
Ähnliche Frage zu SO .
Glutanimate

Antworten:

15

Versuchen Sie etwas wie:

find "$(cd ..; pwd)" -name "filename"
Scrutinizer
quelle
Danke, ich habe gerade getestet $(cd ..; pwd). Hier funktioniert es in Ordnung, aber wenn ich es alleine in einem Terminal mache, kann ich das übergeordnete Verzeichnis nicht abrufen ... Ich erhalte "Bash: <Verzeichnis>: Ist ein Verzeichnis. Und wenn ich es $(cd ..; echo "something")erhalte" etwas: kein Befehl "
JorgeeFG
Meinst du wie ein separater Befehl? Dann müssten Sie das Dollarzeichen weglassen:(cd ..; pwd)
Scrutinizer
Danke, das war es. Irgendwelche Hinweise, warum ich das $ entfernen soll, wie wirkt es sich auf die Subshell aus?
JorgeeFG
1
Ja ( ... )bedeutet in einer Subshell ausführen, die Ausgabe wird nach stdout geschrieben. $( ... )steht für "Command Substitution". Letzteres kann verwendet werden, als wäre es eine variable Erweiterung.
Scrutinizer
find / -name "filename"
Panther
12

Probieren Sie die folgenden -execOptionen aus find:

find .. -name "filename" -exec readlink -f {} \;

Hinweis: readlinkGibt den Wert eines symbolischen Links oder eines kanonischen Dateinamens aus.

Sylvain Pineau
quelle
Dies ruft readlink für jede Datei auf, so dass es sehr unwirksam ist.
16.
9

Sie können die bashTilde-Erweiterung verwenden, um den absoluten Pfad des aktuellen Arbeitsverzeichnisses abzurufen. Auf diese Weise wird auch findder absolute Pfad für die Ergebnisse gedruckt:

find ~+ -type f -name "filename"

Wenn in ausgeführt ~/Desktop, wird dies auf erweitert

find /home/yourusername/Desktop -type f -name "filename"

und druckt Ergebnisse wie:

/home/yourusername/Desktop/filename

Wenn Sie diesen Ansatz mit dem übergeordneten Verzeichnis des aktuellen Arbeitsverzeichnisses verwenden möchten, müssen Sie cdvor dem Aufruf Folgendes tun find:

cd .. && find ~+ -type f -name "filename"
Dessert
quelle
7

Der einfachste Weg ist

find "$(pwd -P)" -name "filename"
Vivek
quelle
Ja! Oderfind `pwd -P` -name "filename"
Apollys unterstützt Monica
Dadurch werden Dateien im aktuellen Verzeichnis gefunden, die nicht vom übergeordneten Verzeichnis stammen.
16.
1

Auch mit PWD können Sie das vollständige Verzeichnis anzeigen. Pwd zeigt Ihnen alle Ihre Verzeichnisse, in denen Sie sich befinden, wie das Erweitern des Dateinamens. Hoffe das hat geholfen.

Sir_Dippingsauce
quelle
1

Dies hat bei mir funktioniert, wird aber nur das erste Mal zurückgegeben.

realpath $(find . -type f -name filename -print -quit)

Vollständige Pfade für alle Vorkommen abrufen (wie von Sergiy Kolodyazhnyy vorgeschlagen)

find . -type f -name filename | xargs realpath
Wyrmwood
quelle
Vorheriger Kommentar entfernt, +1, guter Job @Wyrmwood
Sergiy Kolodyazhnyy
1

Letzte Verzeichniskomponente mit Parameter Expansion entfernen .

find "${PWD%/*}" -name 'filename'

Ein Beispiel, wie Sie Mapfile verwenden können , um die Ausgabe von Find für die spätere Verwendung in einem indizierten Array zu speichern.

mapfile -t -d '' < <(find ${PWD%/*} -name 'filename' -print0)

(Wenn kein Arrayname angegeben ist, ist MAPFILE der Standard-Arrayname.)

for i in "${MAPFILE[@]}"; do
    echo "$((n++)) $i"
done
bac0n
quelle