Es gibt im Wesentlichen 2 Methoden, die Sie verwenden können, um dies zu tun. Einer analysiert die Zeichenfolge, während der andere die einzelnen Dateien bearbeitet. Die Zeichenfolge ein Tool wie verwenden Parsen grep
, sed
oder awk
ist offensichtlich schneller sein würde , aber hier ist ein Beispiel sowohl, als auch, wie zeigt man „Profil“ die 2 - Methoden.
Beispieldaten
Für die folgenden Beispiele verwenden wir die folgenden Daten
$ touch dir{1..3}/dir{100..112}/file{1..5}
$ touch dir{1..3}/dir{100..112}/nile{1..5}
$ touch dir{1..3}/dir{100..112}/knife{1..5}
Löschen Sie einige der *f*
Dateien von dir1/*
:
$ rm dir1/dir10{0..2}/*f*
Ansatz Nr. 1 - Parsen über Zeichenfolgen
Hier werden wir die folgenden Werkzeuge verwenden, find
, grep
, und sort
.
$ find . -type f -name '*f*' | grep -o "\(.*\)/" | sort -u | head -5
./dir1/dir103/
./dir1/dir104/
./dir1/dir105/
./dir1/dir106/
./dir1/dir107/
Ansatz 2 - Analysieren mit Dateien
Dieselbe Werkzeugkette wie zuvor, außer dass wir diesmal dirname
anstelle von verwenden werden grep
.
$ find . -type f -name '*f*' -exec dirname {} \; | sort -u | head -5
./dir1/dir103
./dir1/dir104
./dir1/dir105
./dir1/dir106
./dir1/dir107
HINWEIS: In den obigen Beispielen wird head -5
lediglich der Umfang der Ausgabe beschränkt, mit der wir uns in diesen Beispielen befassen. Sie werden normalerweise entfernt, um Ihre vollständige Auflistung zu erhalten!
Ergebnisse vergleichen
Wir können time
einen Blick auf die beiden Ansätze werfen.
dirname
real 0m0.372s
user 0m0.028s
sys 0m0.106s
grep
real 0m0.012s
user 0m0.009s
sys 0m0.007s
Deshalb ist es immer am besten, wenn es möglich ist, mit den Saiten umzugehen.
Alternative Methoden zum Parsen von Zeichenfolgen
grep & PCRE
$ find . -type f -name '*f*' | grep -oP '^.*(?=/)' | sort -u
sed
$ find . -type f -name '*f*' | sed 's#/[^/]*$##' | sort -u
awk
$ find . -type f -name '*f*' | awk -F'/[^/]*$' '{print $1}' | sort -u
uniq
In die Mischung zu werfen hilft sehr, indem die wiederholten Linien, die bereits direkt nebeneinander sind, entfernt werden.find . -type f -name '*f*' -printf '%h\0' | uniq -z | sort -zu | tr '\0' '\n'
. Oder wenn Ihre Tools etwas älter sind, hat uniq möglicherweise nicht die Option -z.find . -type f -name '*f*' -printf '%h\n' | uniq | sort -u