Finden Sie Verzeichnisse / w-Dateien mit zwei verschiedenen Erweiterungen

393
Dulanic

Ich versuche zu überlegen, wie ich das überhaupt schaffen kann. Ich kann die Dateien damit zum Beispiel finden, aber ich möchte wirklich die Verzeichnisse, die beide Dateitypen enthalten. Irgendwelche Ideen?

Mir ist es auch egal, was der Dateiname ist, nur dass das Verzeichnis eine Datei / w beide Erweiterungen enthält.

find . -type f \( -name "*.ext1" -or -name "*.ext2" \) 
0

1 Antwort auf die Frage

0
Kamil Maciorowski
{ 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 -ufür jede der beiden Verlängerungen gibt es ein Rohr;
  • Die letzten sort | uniq -dZeilen werden mehrmals gedruckt. Ein Verzeichnispfad wird mehrmals angezeigt, wenn er von jedem zurückgegeben wird find ... | sort -u.

Es gibt mindestens zwei Probleme:

  1. -printfist 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 

    xargswird sich beschweren, wenn findnichts findet; Dies sollte die Logik jedoch nicht brechen.

  2. 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.

Tolle Antwort! Das ist mehr als ich erwartet hatte. Ich danke dir sehr. Dulanic vor 5 Jahren 0