OSX-Befehlszeile: Suchen Sie nach doppelten Dateinamen mit unterschiedlichen Erweiterungen

OSX-Befehlszeile: Suchen Sie nach doppelten Dateinamen mit unterschiedlichen Erweiterungen

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 .jpgDateien gefunden, es wird geprüft, ob die entsprechende .pngDatei vorhanden ist, und der vollständige Pfad ohne Erweiterungen angezeigt.

Beachten Sie, dass es bei einer wesentlich geringeren Anzahl .pngvon Dateien effizienter ist, nach diesen zu suchen und nach den entsprechenden .jpgDateien zu prüfen.

[Getestet mit bashUbuntu 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 -cum die Anzahl zu erhalten, und dann am Ende umgekehrt sortieren, um zuerst die Duplikate aufzulisten. Am Ende awkwird 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.ywird foo.x.

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

verwandte Informationen