
Ich bin alle ähnlichen Fragen durchgegangen und habe einige Befehlszeilen-Dienstprogramme wie Duff installiert, aber ohne Erfolg.
In meinem Bilderverzeichnis habe ich Bilder mit demselben Namen, aber unterschiedlichen Erweiterungen (jpg und png). Ich möchte nur die Dateinamen doppelter Dateinamen mit unterschiedlichen Erweiterungen drucken. (z. B. foo.jpg und foo.png) Oder mindestens einen Dateinamen (foo)
Bisher habe ich diese Methoden ausprobiert
find . -exec bash -c 'basename "$0" ".${0##*.}"' {} \; | sort | uniq
find . -type f \( -name "*.jpg" -o -name "*.png" \)
Die meisten dieser Befehle geben mir entwederNichtsODERAlle DateienODEReinzigartigDateinamen, aber nicht dieDuplikate.
Antwort1
Ich würde eine Änderung Ihres zweiten Befehls vorschlagen:
find . -type f -name "*.jpg" | \
while read -r f; do [ -e "${f%.jpg}.png" ] && echo "${f%.jpg}"; done
Dadurch werden alle .jpg
Dateien gefunden, es wird geprüft, ob die entsprechende .png
Datei vorhanden ist, und der vollständige Pfad ohne Erweiterungen angezeigt.
Beachten Sie, dass es bei einer wesentlich geringeren Anzahl .png
von Dateien effizienter ist, nach diesen zu suchen und nach den entsprechenden .jpg
Dateien zu prüfen.
[Getestet mit bash
Ubuntu 18.04.1.]
Antwort2
Ich akzeptiere und schätze die Antwort. Inzwischen habe ich dieses Python-Skript bekommen, das einigermaßen gut funktionierte und dem entsprach, was ich suchte. Ich habe versucht, die Quelle zu finden, konnte sie aber in den Hunderten von Tabs, die ich durchsucht habe, 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, erteilen Sie ihr Rechte und führen Sie sie anschließend im Ordner aus.
./duplicates.py Images
Antwort3
Sie müssen verwenden, uniq -c
um die Anzahl zu erhalten, und dann am Ende umgekehrt sortieren, um zuerst die Duplikate aufzulisten. Am Ende awk
wird verwendet, um nach Zeilen zu filtern, die mit 2 oder höher beginnen.
$ find . -type f -exec sh -c 'basename ${0%.*}' {} \; | sort | uniq -c | sort -r | awk 'int($1)>=2'
2 foo
Hier %.*
wird die Erweiterung entfernt, sodass foo.x.y
wird foo.x
.
Anstelle eines einfachen find . -type f
, das alle Dateien finden würde, könnten Sie auch nach *.jpg
oder *.png
Dateien filtern, wie in Ihrem zweiten Befehl.