# Shell: Einzelne Datei umbenennen



## holly123 (18. April 2008)

Hi Leute, 

ich bin neu im Umgang mit Linux, und habe jetzt ein kleines problemchen... Ich habe schon ein bisschen gegoogled, und ich weiß wie ich ein ganzes verzeichnis auslesen kann, aber dann nur die erste datei nehmen und umbenennen, das habe ich leider noch nicht geschafft... darum wende ich mich jetzt an das forum!


Ich habe ein Verzeichnis das ist voller Dateien, welche alle einenen zufälligen Namen, aber die gleiche Endung haben:
z.B. 
ab30dl30ald183nd.tmp
od03dlei83kdl39d.tmp
2k10937jd3leoz9.tmp


Ich möchte ein Shell-Script schreiben, welches mir quasi, nur eine (oder die erste) datei in dem verzeichnis mit der Endung .tmp umbenennt und mir den neuen Dateinamen inkl. Endung ausgibt...
d.H. aus ab30dl30ald183nd.tmp  wird 20080415180013.gif      =  (datum).gif

kann mir vielleicht jemand helfen

Vielen Dank!
holly123


----------



## kalle123456 (18. April 2008)

Hallo,

hier mal ein kleiner Denkansatz.


```
#!/bin/sh

DATUM=$(date +%Y%m%d%H%i%s)
mv ab30dl30ald183nd.tmp {DATUM}.gif
```

Wie meinst du es mit ausgeben?

Gruss


----------



## holly123 (18. April 2008)

hi kalle123456,

danke, sowas ähnliches habe ich auch gerade hinbekommen. jetzt ist noch mein problem, wie ich den dateinamen aus dem verzeichnis auslesen kann... bzw. nur eine datei davon...

habe mir gedacht dass ich mit einer schleife das ganze verzeichnis auslese, und dann einfach die erste datei hernehme... aber das habe ich auch keine ahnung davon...

vielleicht eine idee?


----------



## kalle123456 (18. April 2008)

holly123 hat gesagt.:


> hi kalle123456,
> 
> danke, sowas ähnliches habe ich auch gerade hinbekommen. jetzt ist noch mein problem, wie ich den dateinamen aus dem verzeichnis auslesen kann... bzw. nur eine datei davon...
> 
> ...



Ja welche erste Datei, nach welchen Suchkriterien?


----------



## holly123 (18. April 2008)

kalle123456 hat gesagt.:


> Wie meinst du es mit ausgeben?



einfach ein echo, damit ich weiß wie die neue datei heißt, damit ich die neue datei dann weiterverwenden kann...


----------



## holly123 (18. April 2008)

nein, suchkriterien gibt es nicht, einfach die erste datei die gefunden wird...


----------



## port29 (18. April 2008)

holly123 hat gesagt.:


> hi kalle123456,
> 
> danke, sowas ähnliches habe ich auch gerade hinbekommen. jetzt ist noch mein problem, wie ich den dateinamen aus dem verzeichnis auslesen kann... bzw. nur eine datei davon...
> 
> ...




```
DATUM=$(date +%Y%m%d%H%i%s)
for i in `ls` do

mv $i {DATUM}.gif 
done
```

Naja, ist nur ein Denkansatz, da alle Dateien gleich heißen werden.. Bzw. es wird nur eine geben.


----------



## kalle123456 (18. April 2008)

Da war schon jemand schneller.

Gruss


----------



## holly123 (18. April 2008)

also, das ganze soll für einen kleinen bluetooth-sender genutz werden. d.h. ein handy meldet sich per bluetooth am server an, und dann wird eine vordefinierte datei (hier eine .tmp) aus dem verzeichnis gelesen, dann umbenannt, und dann an das handy zurückgesendet. damit jetzt nicht jedes handy die gleiche datei bekommt, habe ich mir die lösung so vorgestellt...

es gibt ca. 100 verschiedene vordefinierte dateien, jede mit einem zufälligen namen.tmp, das script benennt dann die datei um, damit sie beim nächsten suchdurchgang nicht mehr gefunden wird... 

weiter muss ich dann den neuen namen der datei wissen, damit die richtige datei versendet wird...

hoffe es ist so verständlich


----------



## kalle123456 (18. April 2008)

wo willst du den Namen denn speichern?


----------



## holly123 (18. April 2008)

quasi nur in einer variable, damit der richtige dateiname nachher an ein anderes script übergeben werden kann...


----------



## kalle123456 (18. April 2008)

Musste erstmal essen .


```
#!/bin/sh
COUNT=1
DATUM=$(date +%Y%m%d%H%I%s)
for i in `ls`; do
 mv $i /meine/dateien/$DATUM.$COUNT.gif 
 COUNT=$((COUNT+1))
done
ls -c /meine/dateien/*.* > /mein/pfad/datei.txt
```
$COUNT muss sein, denke brauche ich nicht erklären warum 
Gruss


----------



## holly123 (18. April 2008)

habs jetzt anders gelöst, da ja nur eine datei umbenannt werden soll, nicht alle


```
#!/bin/bash

DATUM=$(date +%Y%m%d%H%M%S)
done=0

# echo $DATUM

for i in *.tmp* ; do

   if [ $done -eq 0 ]
   then
      mv "$i" "${DATUM}.gif" 
      done=1
   else
      break
   fi
 
done
```

ich glaube zwar nicht dass diese lösung elegant ist...

vielen dank euch allen


----------



## olqs (21. April 2008)

Nur einen Dateinamen erhältst du z.B. so

```
ls *.tmp* | head -n 1
```

Dann kann man sich die Überprüfung und die done Variable sparen.

Also statt der Schleife folgendes:

```
mv `ls *.tmp* | head -n 1` ${DATUM}.gif
```


----------

