ubuntuusers.de

Doppelte Dateien finden anhand Dateiname

Status: Ungelöst | Ubuntu-Version: Ubuntu 12.04 (Precise Pangolin)
Antworten |

Dr1zzt

Anmeldungsdatum:
14. August 2010

Beiträge: 9

Hallo zusammen

Ich suche ein Skript, ein Programm oder Anregungen, wie ich doppelte Mediadateien anhand des Dateinamen finde. Die Mediendateien sind teilweise unterschiedlich kodiert, deswegen komme ich mit fdupes und konsorten, welche nach Prüfsummen vergleichen nicht mehr weiter.

Die Herausforderung ist, dass die Mediendateien teilweise recht "wild" benannt sind und teilweise unterschiedliche Dateiformate haben.

Bespieldatei:

Der große Krieger auf dem Schlachtfeld.mp3
Der_große_Krieger_auf_dem_Schlachtfeld.mp3
DergroßeKriegeraufdemSchlachtfeld.mp3
dergroßekriegeraufdemschlachtfeld.mp3
Der große Krieger.mp3
Der_große_Krieger_auf_dem_Schlachtfeld_Superhoerspiel.mp3
EMPFEHLENSWERT Der große Krieger auf dem Schlachtfeld.mp3
großKrieger_auf_dem_Schlachtfeld.mp3
DgroKriegaufdSchlachtfeld.mp3
auf dem Schlachtfeld.mp3
Der große Krieger auf dem Schlachtfeld.mp4
großKriegaufdemSchlachtfeld.wav

Hat wer Anregungen wie man an die Sache am besten rangeht ?

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Klingt kompliziert... ich würde denken, dass eine Kombination aus Dateigröße und Kölner Phonetik ein Ansatz sein könnte.

Eine zu 100% zuverlässige Lösung wirst Du nicht finden können!

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Von wieviel Dateien reden wir?

Gleiche Dateien mit ähnlichem Namen lassen sich bei der Größe gut an der Größe grob vorsortieren, solange sie die gleiche Codierung haben, was wohl häufig der Fall ist.

Sind es viele Dateien, und manuelle Nachkontrolle kommt nicht in Betracht, dann könnte man zur Sicherheit die, mit gleicher Länge, noch mit md5sum auf gleichen Inhalt testen.

Bei unterschiedlichen Formaten sehe ich relativ schwarz. Aber nach dem Vorfiltern sollten es weniger Dateien sein, die zu kontrollieren sind. Diese können vielleicht mit einer strengen Benennungsstrategie dann für später weiter vorbereitet werden.

Dr1zzt

(Themenstarter)

Anmeldungsdatum:
14. August 2010

Beiträge: 9

Naja die Dateianzahl liegt schon so bei 4000, wo halt einzelne Dateien mit unterschiedlicher Kodierung, sprich teilweise 10-30% Varianz in der dateigröße dabei sind. Manuell nachkontrollieren würde ich auf jeden Fall.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13216

Dr1zzt

(Themenstarter)

Anmeldungsdatum:
14. August 2010

Beiträge: 9

Ich glaube das übersteigt meine Fähigkeiten bei weitem. Aber user unknown hat mich auf eine andere Idee gebracht.

Wenn ich mit find nach den Dateien suche, diese dann nach größe sortiere und dann blockweise, sagen wir Suchergebnis 1-15 (oder halt alle 15 Zeilen, den Wert als Variable im script) alphabetisch sortiere, und dann immer eine Leerzeile dazwischen in der Ausgabedatei (zwecks übersicht), müsste ich mit etwas zeitaufwand auch schon einige Dupletten finden.

Mein Grundbefehl ist schon mal der hier:

find . -type f -printf "%k\t %p\n" 2>/dev/null | sort -rn | awk '{printf("%7.1f GB\t%s\n", ($1/1024)/1024,$0)}'

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Du könntest auch mehrfach mit size suchen:

1
find .... \( -size +300M -and -size -350M \) ... 

Eventuell sukzessive in Ordner verschieben (300, 350, 400, ...) und dort weiter vergleichen.

Mit dem Midnight-Commander kann man zwei Verzeichnisse in Fenstern nebeneinander darstellen, auch 2x das gleiche, und diese nach Größe sortieren. Da findet man gleich große auch leicht.

Dr1zzt

(Themenstarter)

Anmeldungsdatum:
14. August 2010

Beiträge: 9

Habe mir jetzt etwas zusammengefrickelt und schaue mal ob ich damit einige Treffer lande. Ich weiß effizient ist anders aber meine Fähigkeiten sind begrenzt 😉

#!/bin/bash

#Suche aller Dateien im Verzeichnis, sortierung nach größe, dateinamen ohne pfad in textdatei
find . -type f -printf "%k\t %p\n" 2>/dev/null | sort -rn | awk '{printf("%7.1f GB\t%s\n", ($1/1024)/1024,$0)}' | awk '{$1=$2=$3=""; print $0}' | rev | sed -e 's:\/:ö:g' |  awk -Fö {'print $1'} | rev > liste

#Größe der Zeilenblöcke
LINES=25

#Abarbeiten der Textdatei, abhängig von größe der zeilenblöcke, namenssortierung innerhalb der Zeilenblöcke
funktion1() {

cat liste | sed "$LINES"q | sort >> liste2
echo "" >> liste2
sed "1,$LINES"d"" liste > liste.tmp
cat liste.tmp > liste
rm liste.tmp
funktion2
}

#Prüfung ob Ursprungstextdatei noch Text enthält, wenn nein löschen der Listen und erstellung einer eindeutig identifizierbaren Endliste (enthält Datum+Zeit im Dateinamen)
funktion2() {
if [ -s liste ]
then
funktion1
else
cat liste2 > $(date +%Y%m%d%H%M%S)liste.txt
rm liste2
rm liste
echo "Durch"
exit 0 

fi
funktion1
}

funktion2

x-haui

Anmeldungsdatum:
18. September 2007

Beiträge: 111

Hallo,

eine weitere Möglichkeit wäre, dass du mal schaust ob dir agrep weiterhilft. Folgendes Script entfernt zunächst die Dateiendungen aus der Dateiliste und schreibt sie in eine zweite Datei. Dann wird für jede Zeile die Anzahl der Whitespaces, Binde- und Unterstriche ermittelt. Die Summe daraus plus ein weiterer Faktor (n) geben dann an, wie "weit" eine Zeile von der aktuellen abweichen darf um noch als Treffer zu gelten. Das funktioniert zumindest für einige Zeilen relativ gut, hat aber natürlich z.B. Probleme bei Zeilen die plötzlich ein ganzes neues Wort enthalten.

#!/bin/bash

n=2

while read l; do 
    echo "${l%\.[^.]*}"
done < "$1" > "${1}_tmp"

while read l; do 
    wscount=$(egrep -o "\s" <<< "$l" | wc -l)
    dashcount=$(grep -o -- "-" <<< "$l" | wc -l)
    uscount=$(grep -o -- "_" <<< "$l" | wc -l)
    echo "Matches for '$l'"
    agrep -i -E "$((wscount + dashcount + uscount + n))" -k "$l" "${1}_tmp"
    echo ""
    echo ++++++++++++
    echo ""

done < "${1}_tmp"

Nachteil in diesem sehr einfachen Script ist auch, dass die die Ergebnisse ohne Dateiendung angezeigt werden, aber das kann man ja ggf noch ergänzen.

microft

Avatar von microft

Anmeldungsdatum:
6. August 2009

Beiträge: 454

Wohnort: Norddeutschland

Das würd ich lassen!

"We_will_rock_you.mp3" von Queen ist was völlig anderes wie "We_will_rock_you.mp3" von Evian.

http://www.dailymotion.com/video/xsph4_we-will-rock-you-the-water-pub-evia_music

Der Zugriff auf die Metadaten macht dich auch nicht schlauer. Siehe "Varius" 😉

cu

Antworten |