OSX-Befehlszeile Finden Sie doppelte Dateinamen mit unterschiedlichen Erweiterungen

371
Tough Guy

Ich habe alle ähnlichen Fragen durchgegangen und einige Befehlszeilen-Dienstprogramme wie duff installiert, jedoch ohne Erfolg.

In meinem Bilderverzeichnis habe ich Bilder mit demselben Namen, jedoch mit unterschiedlichen Erweiterungen (jpg & png). Ich möchte nur die Dateinamen von doppelten Dateinamen mit verschiedenen Erweiterungen drucken. (zB foo.jpg & foo.png) Oder mindestens ein Dateiname (foo)

Bisher habe ich diese Methoden ausprobiert

find . -exec bash -c 'basename "$0" ".$"' {} \; | sort | uniq  find . -type f \( -name "*.jpg" -o -name "*.png" \) 

Die meisten dieser Befehle geben entweder Nothing OR All die Dateien ODER eindeutige Dateinamen zurück, nicht aber die doppelten .

1

3 Antworten auf die Frage

3
AFH

Ich würde eine Änderung Ihres zweiten Befehls vorschlagen:

find . -type f -name "*.jpg" | \ while read -r f; do [ -e "$.png" ] && echo "$"; done 

Dadurch werden alle .jpgDateien gefunden und geprüft, ob die entsprechende .pngDatei vorhanden ist, und der vollständige Pfad wird ohne die Erweiterungen angezeigt.

Beachten Sie, dass es bei viel weniger .pngDateien effizienter ist, nach diesen .jpgDateien zu suchen und nach den entsprechenden Dateien zu suchen .

[Getestet mit bashUbuntu 18.04.1.]

find: unzulässige Option - t Tough Guy vor 5 Jahren 0
@ToughGuy - Ich habe keine `-t` -Option verwendet, aber unter Linux ist` find .` implizit, wenn kein Verzeichnis angegeben wird, und möglicherweise nicht unter OSX. Ich habe das "." Hinzugefügt und den Dateinamen im "echo" zitiert, falls Sie einige ungerade Dateinamen haben, die als Optionen angezeigt werden können. AFH vor 5 Jahren 0
Unter "-typ" versteht OSX find normalerweise [this] (https://ss64.com/osx/find.html). xenoid vor 5 Jahren 0
Ja, [`find` unter Mac erfordert` .` oder einen beliebigen Pfad] (https://superuser.com/a/1322373/432690), POSIX erfordert dies. Hier bei Super User empfehle ich, "." Aus Gründen der Portabilität nie auszulassen. Kamil Maciorowski vor 5 Jahren 0
@ KamilMaciorowski - Danke: Es gibt Dinge, an die ich mich gerade gewöhnt habe. Ohne einen Mac kann ich nicht jede Option jedes Befehls überprüfen, falls er nicht kompatibel ist. AFH vor 5 Jahren 0
1
Tough Guy

Ich akzeptiere und schätze die Antwort. In der Zwischenzeit bekam ich dieses Python-Skript, das ziemlich nahe an dem war, wonach ich gesucht hatte. Ich habe versucht, die Quelle zu finden, konnte sie aber in Hunderten von Tabs, die ich suchte, nicht finden.

#!/usr/bin/env python # Syntax: duplicates.py DIRECTORY import os, sys top = sys.argv[1] d = {}  for root, dirs, files in os.walk(top, topdown=False): for name in files: fn = os.path.join(root, name) basename, extension = os.path.splitext(name)  basename = basename.lower() # ignore case  if basename in d: print(d[basename]) print(fn) else: d[basename] = fn 

Speichern Sie diese Datei als duplicates.py, geben Sie ihr Rechte und führen Sie sie dann im Ordner aus.

./duplicates.py Images 
Das Abgleichen von Namen und alternativen Suffixen ist hilfreich, garantiert jedoch nicht, dass die Dateien tatsächlich Duplikate sind. Sie müssten einen Vergleich der Dateigrößen einschließen und wenn sie übereinstimmen, vergleichen Sie tatsächlich den Dateiinhalt. Hogstrom vor 5 Jahren 0
0
slhck

Sie müssen verwenden uniq -c, um die Zählungen abzurufen, und dann am Ende umkehren, um die Duplikate zuerst aufzulisten. Am Ende awkwird nach Zeilen gesucht, die mit 2 oder höher beginnen.

$ find . -type f -exec sh -c 'basename $' {} \; | sort | uniq -c | sort -r | awk 'int($1)>=2' 2 foo 

Hier %.*streift die Erweiterung ab, so foo.x.ywird foo.x.

Anstelle einer einfachen find . -type f, die alle Dateien finden würde, könnten Sie auch nach *.jpgoder nach *.pngDateien wie in Ihrem zweiten Befehl filtern .

Sicherlich gab es eine lange Liste aller Dateien mit der Anzahl der Duplikate. Kann ich nur die Duplikate bekommen? (zB foo, das zweimal oder dreimal verwendet wird) Tough Guy vor 5 Jahren 0