Wie finde ich Datei- / Verzeichnisnamen, die gleich sind, aber unterschiedliche Groß- / Kleinschreibung / Groß- / Kleinschreibung haben?

7

Wie kann ich die Datei- / Verzeichnisnamen in einem Verzeichnis rekursiv auflisten, die gleich sind, jedoch unterschiedliche Groß- / Kleinschreibung / Groß- / Kleinschreibung haben? Ex.:

INPUT (nicht der lsBefehl, die Verzeichnisse):

[user@localhost ~/a] ls -R
.:
b

./b:
ize  Ize

./b/ize:

./b/Ize:
[user@localhost ~/a] 

AUSGABE:

/b/ize
gasko peter
quelle
Ich denke du meinst "andere Groß- und Kleinschreibung" (nicht "andere Schriftgröße")?
Phunehehe
Duh, Großschreibung, ich konnte nicht herausfinden, was er fragte.
slm
@ gasko-peter suchen Sie nach Dateien mit ähnlichen Namen, weil Sie versuchen, dieselbe Datei mit unterschiedlichen Namen zu identifizieren ?
Evan Carroll

Antworten:

7

Wenn Sie über GNU verfügen uniq, können Sie Groß- und Kleinschreibung nicht berücksichtigen ( -i) und -dnur doppelte Zeilen drucken:

find . | sort -f | uniq -di

Wie @StephaneChazelas in seiner Antwort erwähnt hat , entspricht dies möglicherweise nicht Ihren Erwartungen, wenn Sie doppelte Pfade haben können, die sich nur in Groß- a/b/foound Kleinschreibung unterscheiden (wie und A/b/foo).

terdon
quelle
Sie wollen wahrscheinlich sort -fhier. Beachten Sie auch, dass GNU uniqdie gleiche Einschränkung wie GNU hat, trda es nicht für den Abgleich von Mehrbyte-Zeichen funktioniert.
Stéphane Chazelas
@StephaneChazelas warum will ich sort -f? Wenn uniqich mich mit dem Fall befassen kann, warum sollte ich dann auch die sortGroß- und Kleinschreibung nicht berücksichtigen müssen ? Und was meinst du mit Multi-Byte-Zeichen? Solche Dinge \n, \retc? Wie können sie verschiedene Fälle haben?
Terdon
1
Versuchen Sie es export LC_ALL=C; printf '%s\n' a A b B | sort | uniq -di. Einige Gebietsschemas sortieren ohne Berücksichtigung der Groß- und Kleinschreibung, andere (wie C) nicht. uniqbenötigt eine sortierte Eingabe, die doppelten Zeilen müssen benachbart sein.
Stéphane Chazelas
2

Angenommen, Dateinamen enthalten keine Zeilenumbrüche, können Sie Folgendes tun:

find . | tr '[:upper:]' '[:lower:]' | sort | uniq -d

Beachten Sie, dass einige trImplementierungen wie GNU trden Fall von Mehrbytezeichen nicht ändern.

Beachten Sie auch, dass der gemeldete Pfad möglicherweise nicht der Pfad einer Datei ist. Wenn zum Beispiel eine ./a/b/fOound eine ./A/b/fOoDatei vorhanden sind, wird diese gemeldet ./a/b/foo. Wenn es nicht das ist, was Sie wollen, können Sie Ihre Anforderungen verfeinern.

Stéphane Chazelas
quelle
-1

Alle diese Ideen sind schlecht. Verwenden Sie Prüfsummen und stellen Sie sicher, dass die Dateien identisch sind. Dann wird die Aufgabe einfach.

find . -type f -exec md5sum {} + |
sort |
perl -a -nE'push(@{$db{$F[0]}},$F[1]);END{for(keys%db){say"Dupe detected @{@db{$_}}"if scalar@{$db{$_}}>1}}'

Dies wird jede Datei im Verzeichnis und alle Unterverzeichnisse zusammenfassen und alle Dupes dieser Datei ausgeben, falls vorhanden. Ich habe die Pipeline zur besseren Lesbarkeit mehrzeilig gemacht.

Evan Carroll
quelle
Das OP sucht nicht nach identischen Dateien, sondern nach Dateien mit demselben Namen. Der Inhalt kann abweichen. Sorry, aber es ist diese Idee, die schlecht ist :).
Terdon
In seinem ersten Beispiel wurde eine andere Schriftgröße angegeben . Es reicht aus, anzunehmen, dass er keine Ahnung hat, was er will.
Evan Carroll
1
Es genügt zu sagen, dass Englisch nicht seine Muttersprache ist, kaum die Schuld des OP. Das Beispiel zeigt jedoch deutlich, dass er die Dateien nicht vergleicht, sondern nur nach Dateien mit demselben Namen sucht, wobei die Groß- und Kleinschreibung nicht berücksichtigt wird. Ich sage nur, dass Sie eine Frage genauer lesen möchten, bevor Sie entscheiden, welche Ideen "schlecht" sind.
Terdon
Einverstanden. Dies geht nicht auf die Bedenken des OP ein. Ich finde es auch seltsam, dass Sie eine vom OP akzeptierte Antwort als schlechte Idee bezeichnet haben, weil es nicht das ist, was das OP will!
Joseph R.