{ find . -type f -name "*.ext1" -printf "%h\n" | sort -u; find . -type f -name "*.ext2" -printf "%h\n" | sort -u; } | sort | uniq -d
Erläuterung:
find ... -printf "%h\n"
druckt Verzeichnisse, die übereinstimmende Dateien enthalten;sort -u
entfernt Duplikate;find ... | sort -u
für jede der beiden Verlängerungen gibt es ein Rohr;- Die letzten
sort | uniq -d
Zeilen werden mehrmals gedruckt. Ein Verzeichnispfad wird mehrmals angezeigt, wenn er von jedem zurückgegeben wirdfind ... | sort -u
.
Es gibt mindestens zwei Probleme:
-printf
ist nicht POSIX. Eine tragbare Variante des Befehls kann sein:{ find . -type f -name "*.ext1" | xargs -L 1 dirname | sort -u; find . -type f -name "*.ext2" | xargs -L 1 dirname | sort -u; } | sort | uniq -d
xargs
wird sich beschweren, wennfind
nichts findet; Dies sollte die Logik jedoch nicht brechen.Zeilenumbrüche in Verzeichnisnamen zerstören die Logik. Sie können Fehlalarme erzeugen und die Ausgabe mehrdeutig machen. Tools, die über ihr POSIX-Minimum hinausgehen, unterstützen möglicherweise Optionen, mit denen Sie nullterminierte Zeichenfolgen analysieren können. Das funktioniert in meinem Debian:
{ find . -type f -name "*.ext1" -printf "%h\0" | sort -u; find . -type f -name "*.ext2" -printf "%h\0" | sort -z -u; } | sort -z | uniq -z -d
Um ein besser lesbares Format zu erhalten, leiten Sie es an
tr '\0' '\n'
. Zeilenumbrüche von Verzeichnisnamen führen immer noch zu Mehrdeutigkeiten, aber mindestens mehrere Zeilen eines einzelnen Verzeichnisnamens werden nacheinander angezeigt, so wie Sie dies sicher wünschen.