Wie kann ich eine Liste erstellen von Dateien mit Ihrem absoluten Pfad in Linux?
-
05-07-2019 - |
Frage
Ich Schreibe ein shell-Skript, findet Dateipfade, die als Eingabe.
Aus diesem Grund muss ich generieren rekursive Dateiliste mit vollständigen Pfaden.Für Beispiel, die Datei bar
hat den Pfad:
/home/ken/foo/bar
aber, soweit ich sehen kann, sind beide ls
und find
nur geben Sie den relativen Pfad anzeigen:
./foo/bar (from the folder ken)
Es scheint wie eine offensichtliche Voraussetzung, aber ich kann nicht sehen, nichts in der find
oder ls
man-Seiten.
Wie kann ich erstellen Sie eine Liste der Dateien, die in der shell, einschließlich Ihrer absoluten Pfaden?
Lösung
Wenn Sie find
einen absoluten Pfad geben, mit zu beginnen, wird es absolute Pfade drucken. Zum Beispiel alle .htaccess-Dateien im aktuellen Verzeichnis zu finden:
find "$(pwd)" -name .htaccess
oder wenn Ihre Shell $PWD
in das aktuelle Verzeichnis erweitert:
find "$PWD" -name .htaccess
find
prepends einfach den Weg aus diesem Pfad zur Datei in einen relativen Pfad gegeben wurde.
Greg Hewgill auch vorgeschlagen, pwd -P
verwenden, wenn Sie symbolische Links in Ihrem aktuellen Verzeichnis lösen möchten.
Andere Tipps
readlink -f filename
gibt den vollständigen absoluten Pfad. aber wenn die Datei ein symbolischer Link ist, u werden die endgültigen aufgelösten Namen erhalten.
Verwenden Sie diese für dirs (die /
nach **
in bash benötigt es auf Verzeichnisse zu beschränken):
ls -d -1 "$PWD/"**/
dies für Dateien und Verzeichnisse direkt unter dem aktuellen Verzeichnis, deren Namen eine .
:
ls -d -1 "$PWD/"*.*
diese für alles:
ls -d -1 "$PWD/"**/*
von hier Genommen http://www.zsh.org/mla/users/2002/msg00033.html
In der bash **
ist rekursiv, wenn Sie shopt -s globstar
aktivieren.
Sie können mit
find $PWD
in bash
ls -d "$PWD/"*
Das sieht nur in dem Strom Verzeichnis. Es zitiert „$ PWD“, falls es Leerzeichen enthält.
Die $PWD
eine gute option ist Matthew über.Wenn Sie wollen zu finden, um nur print-Dateien, dann können Sie auch die -f-option, um die Suche nur normale Dateien.Andere Optionen sind "d" für nur Verzeichnisse etc.Also in deinem Fall wäre es (wenn ich will, um die Suche nur nach Dateien mit .c extern):
find $PWD -type f -name "*.c"
oder wenn Sie möchten, dass alle Dateien:
find $PWD -type f
Hinweis:Sie können nicht einen alias für den obigen Befehl, da $PWD wird automatisch abgeschlossen, um Ihrem home-Verzeichnis, wenn der alias wird durch bash.
Wenn Sie die einen absoluten Pfad Befehl geben finden, wird es die Ergebnisse aus mit einem absoluten Pfad spucken. Also, aus dem Ken-Verzeichnis, wenn Sie waren zu geben:
find /home/ken/foo/ -name bar -print
(anstelle des relativen Pfad find . -name bar -print
)
Sie sollten erhalten:
/home/ken/foo/bar
Wenn Sie also eine ls -l
wollen und haben es den absoluten Pfad zurückkehren, können Sie einfach den Befehl find sagen ein ls -l
auszuführen auf, was es findet.
find /home/ken/foo -name bar -exec ls -l {} ;\
Hinweis: Es gibt einen Raum zwischen {}
und ;
Sie werden etwas wie diese:
-rw-r--r-- 1 ken admin 181 Jan 27 15:49 /home/ken/foo/bar
Wenn Sie nicht sicher sind, wo die Datei ist, können Sie immer den Suchort ändern. Solange der Suchpfad beginnt mit „/“, werden Sie einen absoluten Pfad im Gegenzug bekommen. Wenn Sie einen Ort suchen (wie /), wo Sie eine Menge Erlaubnis zu bekommen, werden Fehler verweigert, dann würde ich Standardfehler Umleitung empfehlen, so dass Sie tatsächlich die Entdeckung Ergebnisse sehen können:
find / -name bar -exec ls -l {} ;\ 2> /dev/null
(2>
ist die Syntax für die Borne und Bash-Shells, wird aber mit dem C-Shell nicht funktionieren. Es kann auch in anderen Shells arbeiten, aber ich weiß nur sicher, dass es in Bourne und Bash funktioniert).
Befehl: ls -1 -d "$PWD/"*
Damit werden die absoluten Pfade der Datei geben, wie unten.
[root@kubenode1 ssl]# ls -1 -d "$PWD/"*
/etc/kubernetes/folder/file-test-config.txt
/etc/kubernetes/folder/file-test.txt
/etc/kubernetes/folder/file-client.txt
lspwd() { for i in $@; do ls -d -1 $PWD/$i; done }
Hier ist ein Beispiel, das ohne eine zusätzliche Periode eine Liste ausdruckt und das zeigt auch, wie für eine Datei Spiel zu suchen. Hoffe, das hilft:
find . -type f -name "extr*" -exec echo `pwd`/{} \; | sed "s|\./||"
find / -print
wird dies tun
ls -1 | awk -vpath=$PWD/ '{print path$1}'