ähnlich benannte Dateien finden

ähnlich benannte Dateien finden

Ich verwende OS X 10.7.3. Ich möchte alle Dateien finden, deren Dateinamen gemeinsame Zeichenfolgen aufweisen.

Ich habe einen Ordner, der mehrere Dateien enthält, deren Dateinamen bis auf das Präfix gleich sind. Beispiel:

003 – Sonnenfinsternis.mp3
008 – Schöner Tag.mp3
027 – Sonnenfinsternis.mp3
103 – Sanfte Hügel.mp3
244 – Sanfte Hügel.mp3

Aus dieser Liste möchte ich alle Entitäten mit „völlig eindeutigen“ Namen herausfiltern, in diesem Fall: 008 - Beautiful Day.mp3

Gibt es einen GUI-Client, ein Automator-Skript oder einen Terminalbefehl, der dies erledigt?

Vielen Dank!

Antwort1

ls | cut -b 6- | sort | uniq -c | sort -r

Dadurch werden die Präfixe abgeschnitten und angezeigt, wie oft die Datei "dupliziert" wurde

Antwort2

Dadurch wird eine Liste der Dateinamen ohne Präfix gedruckt:

awk -F ' - ' '{counts[$2]++; names[$0]} END {for (item in counts) {if (counts[item] > 1) {print item}}}' < <(printf '%s\n' *)

Beispielausgabe:

Solar Eclipse.mp3
Rolling Hills.mp3

So drucken Sie den vollständigen Dateinamen jeder Datei:

awk -F ' - ' '{counts[$2]++; names[$0]} END {for (name in names) {split(name, parts, / - /); if (counts[parts[2]] > 1) {print name}}}' < <(printf '%s\n' *)

Beispielausgabe:

027 - Solar Eclipse.mp3
003 - Solar Eclipse.mp3
244 - Rolling Hills.mp3
103 - Rolling Hills.mp3

Es gibt keine Garantie dafür, dass die Dateien in der Ausgabe gruppiert sind (obwohl dies in diesem einfachen Beispiel der Fall ist). Wenn Sie GNU AWK ( gawk) haben, können Sie die Ausgabe gruppieren:

awk -F ' - ' '
    {
        counts[$2]++;
        names[++c] = $2 " - " $1
    }
    END {
        num = asort(names);
        for (i = 1; i <= num; i++) {
            split(names[i], indices, / - /)
            if (counts[indices[1]] > 1) {
                print indices[2] " - " indices[1]
            }
        }
    }
' < <(printf '%s\n' *)

Wenn Sie nicht haben gawk, können Sie Folgendes verwenden sort:

awk ... | sort -k3,3

Anstatt printfProzesssubstitution zu verwenden, können Sie es in das AWK-Skript einspeisen. Oder Sie können es findentweder in einer Pipe oder mithilfe von Prozesssubstitution verwenden, wenn Sie dies rekursiv tun möchten. Wenn Sie einen rekursiven Lauf zum globalen Vergleichen von Dateinamen wünschen, müssen Sie die Verzeichnisnamen entfernen, die findstandardmäßig ausgegeben werden.

verwandte Informationen