Ich versuche, eine Liste der Verzeichnisse abzurufen, die in einem bestimmten Ordner enthalten sind.
Angesichts dieser Beispielordner:
foo/bar/test
foo/bar/test/css
foo/bar/wp-content/plugins/XYZ
foo/bar/wp-content/plugins/XYZ/js
foo/bar/wp-content/plugins/XYZ/css
baz/wp-content/plugins/ABC
baz/wp-content/plugins/ABC/inc
baz/wp-content/plugins/ABC/inc/lib
baz/wp-content/plugins/DEF
bat/bar/foo/blog/wp-content/plugins/GHI
Ich möchte einen Befehl, der zurückgibt:
XYZ
ABC
DEF
GHI
Im Wesentlichen suche ich nach Ordnern, die sich in wp-content / plugins / befinden
Die Verwendung find
hat mich am nächsten gebracht, aber ich kann sie nicht verwenden -maxdepth
, da der Ordner variabel von dem Ort entfernt ist, an dem ich suche.
Wenn Sie Folgendes ausführen, werden alle untergeordneten Verzeichnisse rekursiv zurückgegeben.
find -type d -path *wp-content/plugins/*
foo/bar/wp-content/plugins/XYZ
foo/bar/wp-content/plugins/XYZ/js
foo/bar/wp-content/plugins/XYZ/css
baz/wp-content/plugins/ABC
baz/wp-content/plugins/ABC/inc
baz/wp-content/plugins/ABC/inc/lib
baz/wp-content/plugins/DEF
bat/bar/foo/blog/wp-content/plugins/GHI
?
. Für Bash (wie in der Frage markiert) funktioniert dies .find
Implementierungen, die ein?
oder ein Ersatzzeichen oder eine Form der Escape-Funktion für nicht druckbare Zeichen ausgeben, tun dies nur, wenn die Ausgabe an ein Terminal geht, nicht, wenn sie an eine Pipe wie hier geht.sed
/awk
alle Dateien in einer Zeile haben, nicht gebrochen wird. Nun kann man argumentieren, dass es nützlicher wäre , eineABC?BCD
oderABC\nBCD
für eine interaktive / Terminal-Ausgabe zu erhalten, als zweiABC
undBCD
Zeilen für ein aufgerufenes Verzeichnis zu erhalten$'ABC\nBCD
. Das ist auf der Ebene der Benutzerpräsentation, wir könnten auch darauf hinweisen, dass für eine Datei namens$'AB\bC'
, wenn die Ausgabe an ein Terminal geht, SieAC
ohne einen solchen?
Ersatz sehen würden ...Bash-ically:
Drucke:
oder
Drucke:
quelle
Sie könnten einen
find
Rückgriff haben, eine Art:quelle
Für Bash: Einfach (funktioniert für Dateien / Verzeichnisse mit Leerzeichen und Zeilenumbrüchen ):
Wll drucken:
Auch wenn Dateien erstellt wurden.
quelle
dotglob
Option, wenn dies unerwünscht ist) und zusätzlich zu Verzeichnissen Symlinks zu Verzeichnissen enthält (**
würde auch Symlinks in Bash 4.2 und früher durchlaufen).find
schließt keine Datei aus. globs schließt Punktdateien aus, es lohnt sich, auf einen Unterschied zwischen den beiden hinzuweisen.Der
tree
Befehl ist genau für diesen Zweck ausgelegt. Die Tiefe kann mit der-L
Flagge gesteuert werden . Hier ist ein Beispiel auf einer lokalen Wordpress-Site, die ich pflege:quelle
Aufbauend auf der Antwort von DopeGhoti, wie wäre es mit einer Matching-Schleife:
Der Grund dafür ist, dass Sie es möglicherweise mit mehreren verwirrend / umständlich finden
-exec
, während Sie dennoch Probleme mit bestimmten Dateinamen vermeiden, die \ n '' usw. enthalten. -Print0 verwendet Nulltrennzeichen zwischen den Ergebnissen.quelle
Aufbauend auf dem, was Sie begonnen haben:
egrep greift nach * wp-content / plugins / * und allen Zeichen bis zum nächsten Schrägstrich / oder Zeilenende $ - einschließlich des gewünschten Teils.
sed wählt mit einem Trennzeichen ~ den gewünschten Teil mit dem ersten Satz von Klammern () aus und verwendet \ 1 (was Sie wollen) als Ersatz für alles
uniq filtert doppelte Ergebnisse heraus
quelle