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 beide ls
und find
nur relative Pfadlisten an:
./foo/bar (from the folder ken)
Es scheint eine offensichtliche Anforderung zu sein, aber ich kann auf den find
oder ls
Manpages nichts sehen .
Wie kann ich eine Liste der Dateien in der Shell einschließlich ihrer absoluten Pfade erstellen?
find /home/ken/foo/bar -exec ls -ld $PWD/{} \;
Antworten:
Wenn Sie zunächst
find
einen absoluten Pfad angeben, werden absolute Pfade gedruckt. So finden Sie beispielsweise alle .htaccess-Dateien im aktuellen Verzeichnis:oder wenn Ihre Shell
$PWD
in das aktuelle Verzeichnis erweitert wird:find
Stellen Sie einfach den Pfad, den es erhalten hat, einem relativen Pfad zur Datei von diesem Pfad voran.Greg Hewgill schlug außerdem vor
pwd -P
, Symlinks in Ihrem aktuellen Verzeichnis aufzulösen.quelle
pwd -P
.ls -d -1 $PWD/**/*
aber ich denke,find $PWD
funktioniert auch (in Bash getestet)find $PWD
Ist einfach. Diels
Beschwörung ist komplex und unhandlich (es sei denn, Sie alias es).find
ist nicht abhängig von Shell-Glob-Erweiterungen, funktioniert also in jeder Shell.find
ist auch viel flexibler, ich kann eine rekursive Liste aller Dateien oder vielleicht aller Verzeichnisse erhalten, oder vielleicht möchte ich eine Liste aller XML-Dateien oder aller Dateien, die in der letzten Woche geändert wurden. All das ist möglich mitfind
, aber nicht einfach mitls
.find "`pwd`" -name .htaccess
wegen Leerzeichen in Verzeichnisnamen verwendengibt den vollen absoluten Weg an. Wenn es sich bei der Datei jedoch um einen Symlink handelt, erhalten Sie den endgültig aufgelösten Namen.
quelle
realpath
stattdessenbrew install coreutils
, wird die ausführbare Datei als/usr/local/opt/coreutils/libexec/gnubin/readlink
Verwenden Sie diese für dirs (die
/
nach dem**
in bash benötigt wird , es auf Verzeichnisse zu begrenzen):Dies gilt für Dateien und Verzeichnisse direkt unter dem aktuellen Verzeichnis, deren Namen Folgendes enthalten
.
:das für alles:
Von hier genommen http://www.zsh.org/mla/users/2002/msg00033.html
In Bash
**
ist rekursiv, wenn Sie aktivierenshopt -s globstar
.quelle
Sie können verwenden
in bash
quelle
Dies sieht nur im aktuellen Verzeichnis aus. Es zitiert "$ PWD", falls es Leerzeichen enthält.
quelle
Befehl:
ls -1 -d "$PWD/"*
Dies gibt die absoluten Pfade der Datei wie unten an.
quelle
Das
$PWD
ist eine gute Option von Matthew oben. Wenn Sie möchten, dass find nur Dateien druckt, 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. In Ihrem Fall wäre es also (wenn ich nur nach Dateien mit .c ext suchen möchte):oder wenn Sie alle Dateien wollen:
Hinweis: Sie können keinen Alias für den obigen Befehl erstellen, da $ PWD automatisch in Ihrem Home-Verzeichnis vervollständigt wird, wenn der Alias von bash festgelegt wird.
quelle
Wenn Sie dem Befehl find einen absoluten Pfad geben, werden die Ergebnisse mit einem absoluten Pfad ausgespuckt. Also, aus dem Ken-Verzeichnis, wenn Sie Folgendes eingeben würden:
(anstelle des relativen Pfades
find . -name bar -print
)Du solltest bekommen:
Wenn Sie also einen möchten
ls -l
und den absoluten Pfad zurückgeben möchten , können Sie dem Befehl find einfach anweisen, einen Befehl fürls -l
alles auszuführen, was er findet.HINWEIS: Zwischen
{}
und befindet sich ein Leerzeichen;
Sie werden so etwas bekommen:
Wenn Sie nicht sicher sind, wo sich die Datei befindet, können Sie den Suchort jederzeit ändern. Solange der Suchpfad mit "/" beginnt, erhalten Sie im Gegenzug einen absoluten Pfad. Wenn Sie nach einem Ort suchen (wie /), an dem Sie viele Fehler erhalten, denen die Berechtigung verweigert wurde, würde ich empfehlen, Standardfehler umzuleiten, damit Sie die Suchergebnisse tatsächlich sehen können:
(
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.)quelle
ls
Prozess übergeben-exec ls -ld {} +
. (Sie möchten wahrscheinlich-d
keinenls
Listenverzeichnisinhalt haben ). Oder besser, verwenden Sie die integrierte Funktion von findls
mitfind ... name bar -ls
. Außerdem ist die Syntax für ein Argument pro Befehl falsch: Sie müssen das Semikolon aus der Shell in Anführungszeichen setzen{} \;
.fd
Verwenden Sie
fd
(alternativ zufind
) die folgende Syntax:Wo
.
ist das Suchmuster undfoo
ist das Stammverzeichnis.Um beispielsweise alle Dateien
etc
rekursiv aufzulisten, führen Sie Folgendes aus :fd . /etc -a
.quelle
Nur eine Alternative zu
um genau zu bestimmen, dass
*
es sich um eine Shell-Erweiterung handeltwürde das gleiche tun (der Nachteil, den Sie nicht verwenden können
-1
, um durch neue Zeilen zu trennen, nicht durch Leerzeichen).quelle
-1
ich das Trennen durch Linien?quelle
Hier ist ein Beispiel, das eine Liste ohne zusätzlichen Punkt ausdruckt und das auch zeigt, wie nach einer Dateimatchung gesucht wird. Hoffe das hilft:
quelle
Das hat bei mir funktioniert. Aber es wurde nicht in alphabetischer Reihenfolge aufgelistet.
Dieser Befehl listet sowohl alphabetisch als auch versteckte Dateien auf.
quelle
stat
Absoluter Pfad einer einzelnen Datei:
quelle
Vielleicht möchten Sie dies versuchen.
Sie können abs Pfad mit
for
Schleife undecho
einfach ohne erhaltenfind
.quelle
Wenn Sie eine Liste aller Dateien in aktuellen sowie Unterverzeichnissen benötigen
Wenn Sie eine Liste aller Dateien nur im aktuellen Verzeichnis benötigen
quelle
Dies gibt den kanonischen Pfad an (löst Symlinks auf):
realpath FILENAME
Wenn Sie einen kanonischen Pfad zum Symlink selbst möchten, dann:
realpath -s FILENAME
quelle
Die meisten, wenn nicht alle vorgeschlagenen Methoden führen zu Pfaden, die nicht direkt in einem anderen Terminalbefehl verwendet werden können, wenn der Pfad Leerzeichen enthält. Im Idealfall werden den Ergebnissen Schrägstriche vorangestellt. Das funktioniert bei mir unter macOS:
quelle
find / -print
werde das tunquelle
quelle