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?
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.
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.
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.
Sie können verwenden
find $PWD
in bash
ls -d "$PWD/"*
Dies sieht nur im aktuellen Verzeichnis aus. Es wird "$ PWD" in Anführungszeichen gesetzt, falls es Leerzeichen enthält.
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
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.
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.).
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|\./||"
lspwd() { for i in [email protected]; do ls -d -1 $PWD/$i; done }