Wie kann ich erstellen Sie eine Liste von Dateien mit Ihren absoluten Pfad unter Linux?
Schreibe ich ein shell-Skript nimmt die Datei-Pfade als Eingabe.
Aus diesem Grund, ich brauche, um zu generieren rekursive Dateiliste mit vollständigen Pfaden. Zum Beispiel, die Datei bar
hat den Pfad:
/home/ken/foo/bar
aber, soweit ich sehen kann, beide ls
und find
geben nur den relativen Pfad Inserate:
./foo/bar (from the folder ken)
Es scheint wie eine offensichtliche Voraussetzung, aber ich kann nichts sehen in der find
oder ls
man-Seiten.
Wie kann ich erstellen Sie eine Liste von Dateien in der shell, einschließlich Ihrer absoluten Pfaden?
- Verwendung:
find /home/ken/foo/bar -exec ls -ld $PWD/{} \;
Du musst angemeldet sein, um einen Kommentar abzugeben.
Geben, wenn Sie
find
einen absoluten Pfad, um mit zu beginnen, es wird gedruckt, absolute Pfade. Zum Beispiel, alle zu finden .htaccess-Dateien im aktuellen Verzeichnis:oder ob deine shell erweitert
$PWD
im aktuellen Verzeichnis:find
einfach bestimmt den Weg gegeben wurde, um einen relativen Pfad zu der Datei, aus diesem Pfad.Greg Hewgill auch vorgeschlagen
pwd -P
wenn Sie möchten, zu beheben symlinks in Ihrem aktuellen Verzeichnis.pwd -P
.ls -d -1 $PWD/**/*
aber ich denkefind $PWD
funktioniert auch (getestet in der bash)find $PWD
ist einfach. Diels
Beschwörung ist Komplex und unhandlich (es sei denn, Sie verwenden Sie einen alias).find
ist nicht abhängig von der shell-glob-Erweiterungen, so wird die Arbeit in jeder shell.find
ist auch viel flexibler, ich kann eine rekursive Auflistung aller Dateien, oder vielleicht von allen Verzeichnissen, oder vielleicht möchte ich eine Auflistung aller xml-Dateien, oder alle Dateien geändert in der letzten Woche. All das ist möglich mitfind
, aber nicht einfach mitls
.find "`pwd`" -name .htaccess
wegen Leerzeichen im Verzeichnisnamenpwd
Ausgang? Ich benutzte es als Beispiel, aber solange Sie gebenfind
einen absoluten Pfad ausgeben sollte absolute Pfade.find | xargs -I {} readlink -f {}
gibt den vollständigen absoluten Pfad. aber wenn die Datei ist ein symbolischer Link, u erhalten den endgültigen aufgelösten Namen.
Verwenden Sie diese für Verzeichnisse (der
/
nach**
ist notwendig, bash, es zu begrenzen, Verzeichnisse):diese für Dateien und Verzeichnisse direkt unter dem aktuellen Verzeichnis, deren Namen enthalten
.
:diese für alles:
Hier
http://www.zsh.org/mla/users/2002/msg00033.html
In der bash,
**
ist rekursiv, wenn Sie aktivierenshopt -s globstar
.Können Sie
in der bash
Dieser sieht nur in der aktuellen - Verzeichnis. Es zitiert "$PWD" ein, falls er Leerzeichen enthält.
Den
$PWD
ist eine gute option, die von Matthäus über. Wenn Sie möchten finden, nur print-Dateien, dann können Sie auch hinzufügen, die -f-option, um die Suche nur normale Dateien. Andere Optionen sind "d" für Verzeichnisse etc. Also in deinem Fall wäre es (wenn ich will, um die Suche nur nach Dateien mit .c ext):oder wenn Sie möchten, dass alle Dateien:
Hinweis: Sie können nicht einen alias für die oben genannten Befehl, da $PWD wird automatisch abgeschlossen, um Ihrem home-Verzeichnis, wenn der alias wird durch die bash.
Geben, wenn Sie die find-Befehl einen absoluten Pfad angeben, dann spuckt Sie die Ergebnisse mit einem absoluten Pfad. Also, von der Ken-Verzeichnis, wenn Sie waren, um Typ:
(statt dem relativen Pfad
find . -name bar -print
)Sollten Sie bekommen:
Deshalb, wenn Sie möchten, eine
ls -l
und haben es wieder den absoluten Pfad, man kann nur sagen, die find-Befehl zum ausführen einerls -l
auf, was es findet.HINWEIS: Es gibt einen Raum zwischen
{}
und;
Erhalten Sie so etwas wie dieses:
Wenn Sie sich nicht sicher sind wo sich die Datei befindet, können Sie immer ändern Sie den Suchpfad. Solange der such-Pfad beginnt mit "/", bekommen Sie einen absoluten Pfad zurück. Wenn Sie suchen einen Ort (wie z.B./), wo Sie gehen, um eine Menge permission denied-Fehler, dann würde ich empfehlen, Umleitung der standard-Fehler, so dass Sie kann tatsächlich sehen, die Ergebnisse finden:
(
2>
ist die syntax für Borne-und Bash-shells, aber nicht mit der C-shell. Es kann funktionieren, in anderen Hüllen auch, aber ich weiß nur sicher, dass es funktioniert in der Bourne-und Bash).ls
Prozess mit-exec ls -ld {} +
. (Sie werden wahrscheinlich wollen-d
nichtls
list directory contents). Oder besser, verwenden Sie find ' s built-inls
mitfind ... name bar -ls
. Auch Sie haben die syntax falsch, wenn man die arg-pro-Befehl: Sie haben zu zitieren, das Semikolon aus der Schale, so ist es{} \;
.Befehl:
ls -1 -d "$PWD/"*
Dies gibt den absoluten Pfadnamen der Datei wie unten gezeigt.
Hier ist ein Beispiel druckt eine Liste ohne einen zusätzlichen Zeitraum und das auch demonstriert, wie die Suche nach einer Datei übereinstimmen. Hoffe, das hilft:
find /-print
wird dies