# wie sag ichs meiner bash?

## widu

hi,

ich muß leider innerhalb eines Verzeichnisses (samt seiner Unterverzeichnisse) ca 600 Dateien umbenennen, genaugenommen die Endung von .php3 nach .php4 ändern. Daß ich wenig lust habe jede einzelne zu bearbeiten, versteht sich, nur leider versteh ich nicht genug von der bash um ihr mitzuteilen, daß sie das bitte für mich erledigen soll. kann mir da jemand hilfestellung leisten?

----------

## schachti

Installiere Dir mmv, damit geht das.

----------

## psyqil

```
*  sys-apps/rename

      Latest version available: 1.3

      Latest version installed: [ Not Installed ]

      Size of downloaded files: 81 kB

      Homepage:    http://rename.berlios.de/

      Description: tool for easily renaming files

      License:     GPL-2
```

Hat 'nen "-R"-Switch!  :Razz: 

----------

## widu

ich werds ausprobieren,danke.

----------

## widu

hat funktioniert. Danke nochmals.

----------

## nes

Nur der Vollständigkeit halber, das da sollte es auch tun (im konkreten Fall ohne Unterverzeichnisse, die liesen sich aber auch ganz leicht einbringen)

```
#!/bin/sh

# Alle Dateien umbennen, die durch $3 - $n spezifiziert werden

# dabei wird der String $1 im Dateinamen durch $2 ersetzt,

# wobei auch regulaere Ausdruecke erlaubt sind

if [ $# -lt 3 ] ; then

   echo 'Usage: ren <old string> <new string> files'

   echo 'Example:  ren foo bar *.foo  renames all files'

   echo '             *.foo ---> *.bar'

   exit 1

fi

S1=$1 ; shift

S2=$1 ; shift

while [ $# -gt 0 ]; do

   for OLDF in $1 ; do

      NEWF=`echo $OLDF | sed -e "s/${S1}/${S2}/"`

      if [ -f $NEWF ] ; then

           echo "$NEWF exists, $OLDF not renamed"

       else

        echo "renaming $OLDF to $NEWF"

        mv $OLDF $NEWF

      fi

   done

   shift

done

```

lg., nes

----------

## l3u

Ginge das nicht auch einfacher? Also nur mit einer einzigen Kommandozeile und ohne extra Programm? Ich hätte das jetzt so gemacht:

```
for i in `find | grep "php3$"`; do mv $i `echo "$i" | sed "s/php3$/php4/"`; done
```

Wenn man will, kann man ja noch ein echo $i zwecks Fortschrittsanzeige mit reinschreiben oder sowas. Aber muß doch nicht mit Kanonen auf Spatzen schießen ;-)

----------

## benjamin200

 *Quote:*   

> 
> 
> hat funktioniert. Danke nochmals.
> 
> 

 

hast du dich für mmv oder rename entschieden? Ich habe hier ein AMD64 System und rename läuft nur unstable, mit dem Syntax von mmv komme ich nicht so klar. Möchte auch mehrere Dateien indizieren.

Gruß,

Benjamin

----------

## psyqil

Sind grep, mv und sed etwa keine Extraprogramme?  :Twisted Evil: 

----------

## schachti

 *Libby wrote:*   

> 
> 
> Ginge das nicht auch einfacher? Also nur mit einer einzigen Kommandozeile und ohne extra Programm? Ich hätte das jetzt so gemacht:
> 
> ```
> ...

 

Wenn ich mich recht erinnere, gibt das Probleme, wenn die Dateinamen Leerzeichen enthalten. Da jedes white space als field separator zaehlt, zerlegt Dir das for i in diese Dateinamen in die einzelnen Worte...

----------

## schachti

 *benjamin200 wrote:*   

> 
> 
> mit dem Syntax von mmv komme ich nicht so klar.
> 
> 

 

Ist ganz einfach:

```

mmv "*.php3" "#1.php4"

```

sollte das gewuenschte tun. Grundidee von mmv: #1, #2, #3, #4 usw. stehen gerade fuer den Text, auf den das erste *, das zweite *, das dritte * usw. matchen.

----------

## l3u

@psyqil: Naja, mv, grep und sed als "Extra-Programme" zu bezeichnen, geht ein bißchen weit, oder? Dann wär ja die Software im Bios oder auf dem Mainboard oder was weiß ich wo, die dafür sorgt, daß ich gerade was mit der Tastatut schreiben muß auch ein Extra-Programm ;-)

Mit extra-Programm hab ich gemeint, daß man zusätzlich Software installieren muß. Und man muß _defibnitiv_ kein "emerge mv grep sed find" machen (find als extra Programm hast du vergessen *g*), bevor die Kommandozeile funktioniert! Ich mein ja bloß: wozu extra Scripts und Programme installieren, wenn man's mit einer Zeile bash genauso machen kann? :-)

@schachti: Klar wird jedes Leerzeichen als Separator gezählt! Da es sich aber um php-Dateien handelt (.php3 und so Kram ist übrigens depreceated!), geh ich ja mal stark davon aus, daß diese Dateien auf einem Server liegen und keine Leerzeichen im Dateinamen haben!

----------

## schachti

 *Libby wrote:*   

> 
> 
> @schachti: Klar wird jedes Leerzeichen als Separator gezählt! Da es sich aber um php-Dateien handelt (.php3 und so Kram ist übrigens depreceated!), geh ich ja mal stark davon aus, daß diese Dateien auf einem Server liegen und keine Leerzeichen im Dateinamen haben!
> 
> 

 

Naja, das mag in einigen speziellen Fällen zutreffen - aber jemand, der im Nachhinein diesen Thread liest und das mit seinen Urlaubsbildern oder seiner mp3-Sammlung probiert...

----------

## benjamin200

schachti schrieb:

 *Quote:*   

> 
> 
> Ist ganz einfach: 
> 
> Code: 
> ...

 

Wandelt alle *.php3 in *.php4 um, richtig?

schachti schrieb:

 *Quote:*   

> 
> 
> Naja, das mag in einigen speziellen Fällen zutreffen - aber jemand, der im Nachhinein diesen Thread liest und das mit seinen Urlaubsbildern oder seiner mp3-Sammlung probiert...
> 
> 

 

Genau das ist mein Szenario. Ich möchte die Fotos von meiner Digicam, welche ich mit Digikam (Paket) runterlade automatisch umbennen. Die Struktur sieht so aus.

Nach Download:

```

# ls /digicam-download

DSC000001.jpg

DSC000002.jpg

DSC000003.jpg

DSC000004.jpg

DSC000005.jpg

DSC000006.jpg

usw.

usw.

```

Im Foto-Verzeichnis habe ich diese folgendermaßen strukturiert:

```

# ls /digicam-verzeichnis

...

...

Foto-0002367.jpg

Foto-0002368.jpg

Foto-0002369.jpg

Foto-0002370.jpg

Foto-0002371.jpg

Foto-0002372.jpg

Foto-0002373.jpg

Foto-0002374.jpg

```

Wie kann ich jetzt die Dateien in /digicam-download per Kommando indizieren lassen, so das die Dateien aufsteigend umbenannt werden, beginnend mit 2375 und dem richtigen Datennamen + Endung (Foto-0002375.jpg). Kann mir hierfür jemand den Syntax und das Tool nennen?

Gruß

Benjamin

----------

## Deever

```
$ emerge zsh

$ zsh

$ for i (**/*.php3) mv "$i" "${i/php3/php4}"
```

Wobei mmv hier auch ganz gut einsetzbar ist.

Ach ja, hab ich auf diesem Forum schon erwähnt, daß die bash Müll ist?  :Wink: 

Gruß,

/dev

----------

## Aldo

 *schachti wrote:*   

> Wenn ich mich recht erinnere, gibt das Probleme, wenn die Dateinamen Leerzeichen enthalten. Da jedes white space als field separator zaehlt, zerlegt Dir das for i in diese Dateinamen in die einzelnen Worte...

 

Dann füge in dein Script ein:

```

#!/bin/bash

IFS="

"

...

```

----------

## Deever

 *Aldo wrote:*   

> Dann füge in dein Script ein:
> 
> ```
> 
> #!/bin/bash
> ...

 Genial!  :Smile: 

Danke && Gruß,

/dev

----------

## benjamin200

benjamin200 schrieb:

 *Quote:*   

> 
> 
> schachti schrieb: 
> 
> Quote: 
> ...

 

Kann jemand weiterhelfen?

Gruß,

Benjamin

----------

## calvin-gr

mit perl könnte man dies auch sehr gut machen.

----------

## schachti

Evtl. klappt das mit der Lösung von Libby, wenn Du zusätzlich noch einen Counter einbaust - den initialisiertst Du vor dem for mit dem gewünschten Startwert, inkrementierst ihn in der Schleife und benutzt ihn für die Generierung des neuen Dateinamens. Hab' leider gerade keine Zeit, sonst würde ich es direkt basteln...

----------

