it-swarm.com.de

Wie kann ich unter Linux eine Liste von Dateien mit ihrem absoluten Pfad erstellen?

Ich schreibe ein Shell-Skript, das Dateipfade als Eingabe verwendet.

Aus diesem Grund muss ich rekursive Dateilisten mit vollständigen Pfaden generieren. Zum Beispiel hat die Datei bar den Pfad:

/home/ken/foo/bar

aber soweit ich sehen kann, geben sowohl ls als auch find nur relative Pfadauflistungen an:

./foo/bar   (from the folder ken)

Es scheint eine offensichtliche Anforderung zu sein, aber ich kann nichts in den Manpages find oder ls sehen.

Wie kann ich eine Liste der Dateien in der Shell erstellen, einschließlich ihrer absoluten Pfade?

254
Ken

Wenn Sie find einen absoluten Pfad angeben, werden absolute Pfade ausgegeben. So finden Sie beispielsweise alle .htaccess-Dateien im aktuellen Verzeichnis:

find "$(pwd)" -name .htaccess

oder wenn Ihre Shell $PWD in das aktuelle Verzeichnis erweitert:

find "$PWD" -name .htaccess

find stellt einfach den Pfad voran, den er einem relativen Pfad zu der Datei von diesem Pfad gegeben hat.

Greg Hewgill schlug auch vor, pwd -P zu verwenden, wenn Sie Symlinks in Ihrem aktuellen Verzeichnis auflösen möchten.

257
readlink -f filename 

gibt den vollständigen absoluten Pfad an. Wenn es sich bei der Datei jedoch um einen Symlink handelt, erhalten Sie den endgültigen aufgelösten Namen.

186
balki

Verwenden Sie dies für dirs (der / nach ** wird in bash benötigt, um es auf Verzeichnisse zu beschränken):

ls -d -1 "$PWD/"**/

dies gilt für Dateien und Verzeichnisse direkt unter dem aktuellen Verzeichnis, deren Namen einen . enthalten:

ls -d -1 "$PWD/"*.*

das für alles:

ls -d -1 "$PWD/"**/*

Entnommen von hier http://www.zsh.org/mla/users/2002/msg00033.html

In der Bash ist ** rekursiv, wenn Sie shopt -s globstar aktivieren.

105
user431529

Sie können verwenden

find $PWD 

in bash

25
Vinko Vrsalovic
ls -d "$PWD/"*

Dies sieht nur im aktuellen Verzeichnis aus. Es wird "$ PWD" in Anführungszeichen gesetzt, falls es Leerzeichen enthält.

14
didi

Befehl:ls -1 -d "$PWD/"*

Dies gibt die absoluten Pfade der Datei wie folgt an.

[[email protected] ssl]# ls -1 -d "$PWD/"*
/etc/kubernetes/folder/file-test-config.txt
/etc/kubernetes/folder/file-test.txt
/etc/kubernetes/folder/file-client.txt
7
GSM

Der $PWD ist eine gute Option von Matthew oben. Wenn Sie nur Dateien drucken möchten, können Sie auch die Option -type f hinzufügen, um nur normale Dateien zu durchsuchen. Andere Optionen sind "d" nur für Verzeichnisse usw. Also in Ihrem Fall wäre es (wenn ich nur nach Dateien mit .c ext suchen möchte):

find $PWD -type f -name "*.c" 

oder wenn Sie alle Dateien wollen:

find $PWD -type f

Hinweis: Sie können für den obigen Befehl keinen Alias ​​erstellen, da $ PWD automatisch in Ihr Ausgangsverzeichnis vervollständigt wird, wenn der Alias ​​durch Bash festgelegt wird.

6
Gurpreet

Wenn Sie dem Befehl find einen absoluten Pfad geben, werden die Ergebnisse mit einem absoluten Pfad ausgegeben. Also, aus dem Ken-Verzeichnis, wenn Sie Folgendes eingeben würden:

find /home/ken/foo/ -name bar -print    

(anstelle des relativen Pfades find . -name bar -print)

Du solltest bekommen:

/home/ken/foo/bar

Wenn Sie also einen ls -l möchten und den absoluten Pfad zurückgeben möchten, können Sie dem Befehl find einfach mitteilen, dass ein ls -l auf dem gefundenen Objekt ausgeführt werden soll.

find /home/ken/foo -name bar -exec ls -l {} ;\ 

HINWEIS: Zwischen {} und ; ist ein Leerzeichen.

Sie werden so etwas bekommen:

-rw-r--r--   1 ken admin       181 Jan 27 15:49 /home/ken/foo/bar

Wenn Sie sich nicht sicher sind, wo sich die Datei befindet, können Sie den Suchort jederzeit ändern. Solange der Suchpfad mit "/" beginnt, erhalten Sie als Gegenleistung einen absoluten Pfad. Wenn Sie nach einem Ort (wie /) suchen, an dem Sie häufig Fehler mit verweigerten Berechtigungen erhalten, empfehle ich die Umleitung von Standardfehlern, damit Sie die Suchergebnisse tatsächlich sehen können:

find / -name bar -exec ls -l {} ;\ 2> /dev/null

(2> ist die Syntax für die Borne- und Bash-Shells, funktioniert aber nicht mit der C-Shell. Sie funktioniert möglicherweise auch in anderen Shells, aber ich weiß nur sicher, dass sie in Bourne und Bash funktioniert.).

4
Trudius

In diesem Beispiel wird eine Liste ohne zusätzlichen Punkt ausgedruckt und die Suche nach einer Dateiübereinstimmung veranschaulicht. Hoffe das hilft:

find . -type f -name "extr*" -exec echo `pwd`/{} \; | sed "s|\./||"
1
Mike Behr
lspwd() { for i in [email protected]; do ls -d -1 $PWD/$i; done }
1
rxw