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

mehre Dateien umbenennen

bonzei

Newbie
Hallo,

wie benennt man mehrere Dateien in VERSCHIEDENEN Verzeichnissen um ?

habs mit find . -name "*.php" -exec mv {} flash.php \;

probiert, was allerdings zur folge hat, das er nur die datei im aktuellen Verzeichniss umbenennt und die anderen einfach löscht. :(

Jemand ne Idee ?
 

TeXpert

Guru
den Verweis auf die anderen Lösungen hast Du ja schon,

bonzei schrieb:
habs mit find . -name "*.php" -exec mv {} flash.php \;

aber ich hoffe Dir wird auch klar, warum das hier "Blödsinn" sit :)

{} wird im exec-Teil von find zu dem aktuellen Dateinamen expandiert, d.h. Du rufst für alle php-Files unterhalb des aktuellen Verzeichnisses das hier auf:

Code:
mv foo.php flash.php
mv foo2.php flash.php
mv bar/foo.php flash.php
mv bar/foo2.php flash.php
mv baz/foo.php flash.php
mv baz/foo2.php flash.php
...
 
OP
bonzei

bonzei

Newbie
for i in $(find . -name '*.php') ; do mv "$i" $(echo "$i" | sed 's|.php|flash.php |'); done

Wenn ich es so mache, wird aus test.php testflash.php

Sorry Jungs, aber von solchen Scripten hab ich null ahnung und stell mich auch so an.

Aber fast geschafft ;)
 

TeXpert

Guru
bonzei schrieb:
for i in $(find . -name '*.php') ;

gefährlich, wenn Leerzeichen im PFad oder Dateinamen sein dürfen, besser mit einem
Code:
find FOOBAR | while read i ;...
arbeiten.

Sorry Jungs, aber von solchen Scripten hab ich null ahnung und stell mich auch so an.

Aber fast geschafft ;)

da hier keiner weiß, was Du genau machen willst, ist das schwer zu helfen :p

zudem sind in dem Thread ja auch noch andere Möglichkeiten als Schleifen genannt...
 
OP
bonzei

bonzei

Newbie
naja,

wie gesagt, ich will alle Dateien ,einschlieslich Unterverzeichnissen, die mit *.php enden ind flash.php umbenennen.

Wenn ich es mit der genannten Lösung probiere

for i in $(find . -name '*.php') ; do mv "$i" $(echo "$i" | sed 's|.php|flash.php |'); done

nennt er z.B die Datei test.php in testflash.php um.

Heisen soll es aber nur flash.php.

Bin am ausprobieren, aber so wie ich mich kenne wird das nix werden.

Gruß Sascha
 

TeXpert

Guru
Du möchtest Dich damit beschäftigen einen Pfad in Name und Pfad zu zerlegen ;) (man basename und evtl. Stringtechniken der bash, dazu gibts hier posts von mir)

Code:
sed 's|.php|flash.php |'
was soll das machen? es erseztt die Zeichenkette ".php" duch "flash.php"

also, Beispiel: "foo/bar/baz.php" --> streiche .php --> "foo/bar/baz" --> ersetzte das gerade gestrichene durch flash.php --> "foo/bar/bazflash.php"

d.h. Du willst
Code:
sed 's|DATEINAME|flash.php |'
machen -> jetzt musst Du nur noch den Dateinamen extrahieren.

ganz nebenbei, das ist Geschmackssache :) aber ich würde an Deiner Stelle immer sed-Trenner nehmen, die sonst nicht vorkommen, d.h. hier ist ein | schwer zu lesen, da es auch noch eine pipe gibt, da würde *ich* ein 's#foo#bar#' nutzen... aber das ist Geschmackssache ;)
 
OP
bonzei

bonzei

Newbie
aja,

ok ich soll mit find die Dateien mit der Endung .php finden, mit basename das suffix php entfernen und mit sed umbenennen?

Und wie soll ich dann sed mitteilen was es umbennenen soll ?

find > test.php > basename .php > test > sed s/wie bekomm ich test hier rein?/flash.php/ .

Nur nochmal zum Verständniss, ich habe mehrere Dateien in mehreren Unterverzeichnissen.

???
 
Ich würde folgendes nehmen:
Code:
find . -type f -name "*.php" | while read file
do 
 rename="${file%/*}"/flash.php 
 echo mv "$file" "$rename"
done


Oder als Einzeiler:
find . -type f -name "*.php" | while read file; do rename="${file%/*}"/flash.php ; echo mv "$file" "$rename"; done

Um den Befehl scharf zu machen muss man nur das "echo" weg lassen.

Haveaniceday
 
OP
bonzei

bonzei

Newbie
Noch was an teXpert,

den Vorschlag, Manpages zu lesen ist wirklich billig.

Auf die Idee bin ich auch gekommen, aber da ich es nicht verstanden habe hoffte ich hier auf Hilfe.

Zumindest kann man sich so wichtig machen ;)

danke nochmal an die unkomplizierte Hilfe von haveaniceday.
 
@bonzei,

Hilfe zur Selbsthilfe ist sehr wichtig ! Das ist auch das, was die anderen hier machen.
Es macht mehr Sinn die Man-Pages zu verstehen als du denkst.

Wenn es mit den Man-pages nicht klappt solltest du noch mehr lesen !!
Ist wichtiger nach dem zu fragen, was man nicht versteht als über andere zu schimpfen !

:roll:

Haveaniceday
 
OP
bonzei

bonzei

Newbie
ne halt mal, ich schimpf net und will auch niemand auf die Füße treten.

Aber wenn man, was an mir ja unschwer zu erkennen war, einfach nicht auf die Lösung kommt und dann mehrmals durch die Blume gesagt bekommt, was man wie zu machen hat und es erst nicht versteht und dann nochmal fragt, zu guter letzt noch 2 mal auf die manpages verwiesen wird war das vieleicht zu viel des guten.

Es soll jetzt keiner glauben, ich sei zu bekloppt ! (Oder vielleicht doch ?, mal in Ruhe darüber nachgrübel)

Hab immerhin LPI 1 geschafft, ne spaß beiseite, mein Problem ist das mein englisch ziemlich besch*** ist. Das macht die Sache nicht immer einfach.

Gruß Sascha

P.S Sollte ich mich im Ton vergriffen haben entschuldige ich mich hiermit.
 

TeXpert

Guru
Was hast Du davon, wenn Dir hier jemand einen 1 Zeiler hinwirft?

deshalb frage ich ja, was Du an den manpages nicht verstanden hast... oder an meinem Hinweis bzgl. sed...

aber egal, dann wäre mir evtl. auch aufgefallen, dass es einen kürzeren Tipp gegeben hätte ;)

der wäre dann man dirname gewesen...

eine mögliche Lösung wäre also:

Code:
find . -name '*.php' | while read i ; do mv "$i" "$(dirname $i)/flash.php" ; done

while statt for wg. Leerzeichen und Quotes eben auch darum...

spontan hätte ich jetzt sogar gesagt, dass das mit einer puren find-exec auch gehen müsste, aber da müsste ich auch noch mal in die Manpage gehen:

Code:
$ find . -name '*.php'
./bbb/foo.php
./foo.php
$ find . -name '*.php' -exec echo mv {} "$(dirname {})/bar.php" \;
mv ./bbb/foo.php ./bar.php
mv ./foo.php ./bar.php
man beachte die 1. zeile :( ... seltsam insofern, da ein 2. zugriff auf {} normalerweise geht

Code:
$ find . -name '*.php' -exec echo mv "{}" "{}/bar.php" \;
mv ./bbb/foo.php ./bbb/foo.php/bar.php
mv ./foo.php ./foo.php/bar.php
 
OP
bonzei

bonzei

Newbie
Merci ;)

ob du es glaubst oder nicht, ich werde den Einzeiler genau unter die Lupe nehmen und schauen was da passiert. Ist immer mein 2 Weg, wenn ich mal wieder die Manpages nicht verstehe.

Gruß Sascha
 
Oben