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 printf
Prozesssubstitution zu verwenden, können Sie es in das AWK-Skript einspeisen. Oder Sie können es find
entweder 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 find
standardmäßig ausgegeben werden.