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?

War es hilfreich?

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}'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top