• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

dateien mit gleichem dateinamen finden und umbenennen?

stolley

Hacker
hallo zusammen!

ich bin ein ziemlicher scripting-anfänger. deshalb hoffe ich auf eure hilfe. wo oben gesagt, suche ich ein skript, welches mir dateien mit gleichem namen ausfindig macht und dann am besten inkl. pfad auflistet. denn die dateien (fotos) haben unterschiedlichen inhalt.

super-genial wäre es natürlich, wenn das skript automatisch die zweite - doppelte - datei umbenennen würde - meinetwegen bloss indem ein "-2" angefügt würde.

ich habe schon ein wenig im forum gesucht, und dieses skript gefunden, welches man wahrscheinlich bloss ein wenig umändern müsste, damit es meine zwecke erfüllt?!

#!/usr/bin/perl

use strict;
my %gefunden;

open (FINDLIST, "find @ARGV -type f | sort -u |") or die "Fehler beim ausfuehren von find: $!\n";
while (<FINDLIST>) {
chomp;
next if (-d $_); # Verzeichnisse ueberspringen
my $filename=(split /\//)[-1]; # Verzeichnisnamen wegschneiden
if ($gefunden{$filename} > 0) { # War die Datei schon mal da?
print "loesche $_\n";
# unlink $_; # Wenn man sich der Sache sicher ist...
} else {
$gefunden{$filename}++;
}
}
close FINDLIST;

wäre euch echt dankbar für nen kleinen tipp!

gruss
volker
 
suche ich ein skript, welches mir dateien mit gleichem namen ausfindig macht und dann am besten inkl. pfad auflistet.
Code:
find . -type f | perl -le 'print sort{(split/\//,$a)[-1]cmp(split/\//,$b)[-1]}<>'
First! :-D

Thema umbenennen - das willst du ja eigentlich nur, weil sie alle dengleichen (komischen) Namen tragen wie "DSCF1234.JPG", oder? Dann reicht es wenn du alle Dateien neu durchnummerierst statt für jeden Dateinamen mitzuzählen, wie oft dieser schon gesehen wurde, und entsprechend "-N" anzuhängen.
 
OP
S

stolley

Hacker
ähm...

stimmt, die doppelten müssen lediglich umbenannt werden! du hast das problem erkannt. :D

und das schafft dein skript? sorry, kanns gerade nicht ausprobieren. werde es checken und dann das thema korrigieren!

danke schonmal!

gruss
volker
 
Nein, der Schnipsel sortiert sie nur. Für einfache Renames (ohne Sortierung)
Code:
perl -e 'for(<*.jpg>){++$c;$o=$_;s/\d+/$c/;rename$o,$_}'
oder so... selbst ist der Mann.
 
Nach dem Titel hoert sich das fuer mich eher an als suchest du etwas das dir doppelte Dateien findet, ob mit gleichem Dateinamen oder gleichem Inhalt.
Hier wäre dann >fdupes< das richtige gewesen.
 
OP
S

stolley

Hacker
Nach dem Titel hoert sich das fuer mich eher an als suchest du etwas das dir doppelte Dateien findet, ob mit gleichem Dateinamen oder gleichem Inhalt.
Hier wäre dann >fdupes< das richtige gewesen.

vielleicht war ich mit dem titel etwas unpräzise, werde ich gleich mal korrigieren. mir geht es tatsächlich um folgendes:

ich habe ca. 8000 fotos auf meinem rechner - zum teil von verschiedenen kameras. leider haben deshalb einige bilder in versch. unterordnern den gleichen dateinamen - was z.b. beim kopieren in ein verzeichnis zu problemen führt. deshalb möchte ich diese dateien, die den gleichen dateinnamen aber anderen inhalt haben möglichst einfach finden und automatisch umbenennen. so dass es nur noch eindeutige dateinamen gibt.

ich bin mir nicht sicher, ob ich o.g. perl-skript einfach ausprobieren soll? habe von perl nämlich null ahnung... :oops:
 

regexer

Advanced Hacker
stolley schrieb:
ich habe ca. 8000 fotos auf meinem rechner - zum teil von verschiedenen kameras. leider haben deshalb einige bilder in versch. unterordnern den gleichen dateinamen - was z.b. beim kopieren in ein verzeichnis zu problemen führt.
Nach welchen Regeln willst du denn umbenennen? Nur wenn es doppelt vorkommt, oder immer?

Ich würde mir auch Gedanken darüber machen, wie die Dateien sortiert sein sollen, wenn sie in ein Verzeichnis kommen. Zuerst nach Kamera? Am besten, du schreibst uns ein paar Beispiele aus der Praxis und vor allem, wie es hinterher aussehen soll...

ich bin mir nicht sicher, ob ich o.g. perl-skript einfach ausprobieren soll? habe von perl nämlich null ahnung... :oops:
Auf jeden Fall würde ich ohne Dateisicherung gar nichts ausprobieren ;)
 
OP
S

stolley

Hacker
Nach welchen Regeln willst du denn umbenennen? Nur wenn es doppelt vorkommt, oder immer?
stimmt, nur dann sollen sie umbenannt werden.

Ich würde mir auch Gedanken darüber machen, wie die Dateien sortiert sein sollen, wenn sie in ein Verzeichnis kommen. Zuerst nach Kamera? Am besten, du schreibst uns ein paar Beispiele aus der Praxis und vor allem, wie es hinterher aussehen soll...

dir sortierung ist mir eigentlich relativ egal, ich möchte lediglich alle bilder in einem verzeichnis haben, um sie dann zu flickr hochzuladen. ich habe bereits ca. 7000 bilder hochgeladen, es fehlen noch die "doppelten". mir würde es also tatsächlich reichen, wenn die doppelten dateien lediglich ein zusatzzeichen im dateinamen bekommen, damit sie sich einfach nur unterscheiden.

danke schonmal für eure mühe! :D
 
Also vom Prinzip würde ich ein md5sum von den Dateien machen.
Anschliessend diese Liste nach der md5sum sortieren.

Und dann kannst du die Liste abarbeiten. Der erste mit einer bestimmten md5sum
behält seinen Namen, der zweite und jeder weitere mit der gleichen md5sum wird
umbenannt.
Damit wird nur jede Datei einmal angefasst um die Summe zu errechnen.
Ansonsten kann es bei der Anzahl ganz schön lange dauern um die erste Datei
mit 7999, die zweite mit 7998, die ... zu vergleichen.
Um die unwahrscheinlichkeit von einer gleichen md5sum auszuschliessen könntest
du md5-gleichen Dateien noch vorher vergleichen.

Viele Grüße,

Haveaniceday
 
OP
S

stolley

Hacker
Also vom Prinzip würde ich ein md5sum von den Dateien machen.
Anschliessend diese Liste nach der md5sum sortieren.

Und dann kannst du die Liste abarbeiten. Der erste mit einer bestimmten md5sum
behält seinen Namen, der zweite und jeder weitere mit der gleichen md5sum wird
umbenannt.
Damit wird nur jede Datei einmal angefasst um die Summe zu errechnen.
Ansonsten kann es bei der Anzahl ganz schön lange dauern um die erste Datei
mit 7999, die zweite mit 7998, die ... zu vergleichen.
Um die unwahrscheinlichkeit von einer gleichen md5sum auszuschliessen könntest
du md5-gleichen Dateien noch vorher vergleichen.

hi haveaniceday!

danke für den tipp! zu meiner schande muss ich gestehen, dass ich mich bislang noch nicht imstande sehe, dafür ein skript anzufertigen? hättest du eines parat... :oops:
 
Ich hab nur für einen Ansatz Zeit.

Code:
cd "bilderhome"
find . -type f -iname "*.jpg" -exec md5sum {} \; | sort > dateiliste

...
hier müssten man dann z.B. mit einem Perlscript die "dateiliste"
abarbeiten. ( Erste Datei mit einer md5sum behalten, zweite mit der gleichen Summe
umbenennen.
...
...

Die Ausgabe von md5sum "file" sieht so aus:
4c736b0ac92616819edb598011a8d5ff ./meinfile.jpg

Aber vielleicht hat ja jemand mehr Zeit zum helfen.

Haveaniceday
 
OP
S

stolley

Hacker
danke dir trotzdem haveaniceday!

eines macht mich stutzig: erfahre ich über die prüfsumme nicht etwas über den inhalt der datei? den will ich ja doch gar nicht vergleichen, denn der inhalt der bilder ist sicher immer unterschiedlich...

oder hab ich jetzt die voll-blockade?
 

regexer

Advanced Hacker
stolley schrieb:
deines macht mich stutzig: erfahre ich über die prüfsumme nicht etwas über den inhalt der datei? den will ich ja doch gar nicht vergleichen, denn der inhalt der bilder ist sicher immer unterschiedlich...
Stimmt, md5sum sagt etwas über den inhalt der Datei aus.

dir sortierung ist mir eigentlich relativ egal, ich möchte lediglich alle bilder in einem verzeichnis haben, um sie dann zu flickr hochzuladen.
Na dann kannst du doch das allererste script als Vorlage verwenden. Ein unlink (=löschen) wäre natürlich schlecht. Besser ist ein rename (=umbenennen).
 
OOps, vergiss meine erste Lösung. Ich hab nicht richtig gelesen.
Ich bin von gleichen Bildern ausgegangen. Sorry.

Aber das Prinzip geht auch mit Namen. Das Skript unten ist ungetestet !

Code:
nummer=0
LAST=""
cd "bilderhome"
find . -type f -iname "*.jpg" -print | while read file
 do
 echo "${file##*/} $file"
 done | sort | while read a b
 if [ "$LAST" = "${a}" ]
 then
  let nummer=nummer+1
  echo wuerde umbenennen: mv $b $b-$nummer
 else
  nummer=0
 fi
 LAST="${a}" 
done

Edit: Hmm, irgendwie bin ich unkonzentriert. Hatte vergessen das sort einzufügen.

Haveaniceday
 
OP
S

stolley

Hacker
Edit: Hmm, irgendwie bin ich unkonzentriert. Hatte vergessen das sort einzufügen.

kein problem! bin ja dankbar, dass du dir die mühe machst! ich werde das skript mal ausprobieren. werde dann verkünden, ob es funktioniert hat!

vielen dank schonmal an dich und das forum! :D
 
Oben