kanotix.com
Scripte - Dateien benennen wie Ordner?
stalin2000 - Feb 20, 2012 - 07:47 PM
Post subject: 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 - Feb 21, 2012 - 02:02 AM
Post subject: 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 - Feb 23, 2012 - 08:59 AM
Post subject: Dateien benennen wie Ordner?
Super, danke!
totschka - Feb 23, 2012 - 05:10 PM
Post subject:
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.
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 - Feb 24, 2012 - 11:16 AM
Post subject:
totschka wrote:
hmm, das funktioniert, wenn 1 Datei im Ordner liegt.
davon bin ich ausgegangen:
stalin2000 wrote:
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 - Feb 24, 2012 - 02:42 PM
Post subject:
Danke, acritox.
Ich probiere das aus, sobald ich wieder zu Hause bin.
All times are GMT + 1 Hour
Powered by
PNphpBB2 © 2003-2007 The PNphpBB Group
Credits