kanotix.com

Scripte - Dateien benennen wie Ordner?

stalin2000 - 20.02.2012, 19:47 Uhr
Titel: Dateien benennen wie Ordner?
Hallo Ihr,

ich habe Ordner, die vernünftige Namen haben, in denen Dateien liegen, die Film1.avi oder so ähnlich heißen. In jedem Ordner liegt eine solche Datei. Nun möchte ich mittels eines Scripts alle Dateien mit diesen blöden Namen (haben alle die selbe Endung) jeweils so benennen wie der Ordner in dem sie liegen...

Könnte jemand von Euch mir sagen, wie ich dies bewerkstelligen könnte?

Viele Grüße Christopher
acritox - 21.02.2012, 02:02 Uhr
Titel: Dateien benennen wie Ordner?
Code:
find /pfad/zum/ordner -type f | rename -n 's@([^/]*)/[^/]*\.([^/.]*)$@$1/$1.$2@'

"-n" rausnehmen falls das vorgeschlagene Ergebnis passt und wirklich umbenannt werden soll

acritox
stalin2000 - 23.02.2012, 08:59 Uhr
Titel: Dateien benennen wie Ordner?
Super, danke!
totschka - 23.02.2012, 17:10 Uhr
Titel:
hmm, das funktioniert, wenn 1 Datei im Ordner liegt. Bei mehreren Dateien wird die erste Datei umbenannt, die folgenden nicht mehr.

Da gibt es sicher auch einen Kniff, aber bis ich den raus hab, nehme ich solange krename. Winken
Ist aber interessant, ich fühle mich an uralte Unix-Zeiten erinnert, als wir Zeichenketten zerlegt, analysiert und wieder zusammengefügt haben, in einer gescheit gesteuerten Schleife natürlich...
acritox - 24.02.2012, 11:16 Uhr
Titel:
totschka hat folgendes geschrieben::
hmm, das funktioniert, wenn 1 Datei im Ordner liegt.

davon bin ich ausgegangen:
stalin2000 hat folgendes geschrieben::
In jedem Ordner liegt eine solche Datei.


als bash3-Schleife mit mehreren Dateien pro Ordner:
Code:
while read from
do
   to="$(perl -pe 's@([^/]*)/[^/]*\.([^/.]*)$@$1/$1.$2@' <<<"$from")"
   [ "$to" != "$to_old" ] && n=2 && to_old="$to" || to="${to%.*}-$((n++)).${to##*.}"
   echo mv "$from" "$to"
done < <(find /pfad/zum/ordner -type f)

("echo" rausnehmen um wirklich umzubenennen)
die RegExp ist die gleiche wie letztes mal. Die Umbenennungsregel für die weiteren Dateien wäre dabei jetzt so:
Code:
mv ./ordner/a.txt ./ordner/ordner.txt
mv ./ordner/b.txt ./ordner/ordner-2.txt
mv ./ordner/c.txt ./ordner/ordner-3.txt

das funktioniert auch, ist aber etwas langsam, weil perl jedes mal extra neu aufgerufen wird; deshalb wäre es wohl besser das Umformen komplett in perl zu machen:

Code:
find /pfad/zum/ordner -type f | perl -e 'for(<STDIN>){chop; s/'\''/'"'\\\\''"'/g; print "mv '\'\$_\'' ";s@([^/]*)/[^/]*\.([^/.]*)$@$1/$1.$2@; if($_ ne $old) {$n=2; $old=$_;} else {s/(\.[^.]*)$/-$n$1/; $n++}; print "'\'\$_\''\n";}'

um wirklich umzubenennen einfach noch "| sh" ans Ende des Befehls anhängen. Ist auch wieder die gleiche RegExp und die gleiche Umbenennungsregel, nur diesmal in Perl.

die vielen evtl. etwas verwirrenden ', " und \ kommen daher, dass ich die Umbenennung nicht direkt ausführe sondern nur (sozusagen in Scriptform) ausgebe und dabei auch auf Dateinamen wie z.B. "1'2/that's special.txt" vorbereitet sein wollte.

acritox
totschka - 24.02.2012, 14:42 Uhr
Titel:
Danke, acritox.
Ich probiere das aus, sobald ich wieder zu Hause bin.
Alle Zeiten sind GMT + 1 Stunde
PNphpBB2 © 2003-2007