Einzelne Datei verschieben

Quarzar

Cadet 3rd Year
Registriert
Mai 2004
Beiträge
46
Hallo FBler,

ich möchte mit einem SH Script eine Datei, mit einem bestimmten Endung verschieben. Allerdings gibt es in dem Quellordner mehrere Dateien mit der selben Endung.

Also sollte nur bei einer Datei der mv Befehl durchlaufen.

Quellordner /home/test/test/1
Zielordner /home/test/test/2

Was ich bis jetzt habe...

if (ls /home/test/test/2/*.jpg.123 >/dev/null)
then
echo "[INFO] Wait"
else
echo "[INFO] Move new JPG"
mv /home/test/test/1/*.jpg /home/test/test/2 <- hier scheitert es dann ja, da er alle Dateien mit der Endung kopiert, er soll aber nur eine kopieren
fi

Es soll also eine künstliche Warteschlange erzeugt werden. Auf den Ordner /home/test/test/2 greift ein weitere Programm zu, welches die Datei bearbeitet und während der bearbeitung die Endung 123 anhängt.
 
Ich verstehe das Problem nicht. Wenn du nur eine Datei verschieben willst, dann gib halt den Dateinamen an und nicht *.jpg.
 
Gut hatte ich vergessen, Dateinamen variieren komplett und bei über 1000 und neu hinzukommende etwas umständlich. Nur die Endung ist bei allen gleich.

Das Script soll jetzt alle 5min über Cron laufen und dabei jeweils eine Datei verschieben, falls das andere Programm schon mit der vorher verschobenen fertig ist.
 
Zuletzt bearbeitet:
Ah, ich glaube ich hab verstanden. Ich hab das "künstliche Warteschleife" überlesen. Du willst also eine beliebige Datei von den 1000 verschieben, aber nicht alle. Dachte es geht um eine spezielle Datei.

Du kannst alle Files in ein Array einlesen und dann einfach das erste Element nehmen:
Code:
files=(*.jpg)
file=${files[0]}
mv $file /somewhere/else

Wenn dus zufällig haben willst:
Code:
files=(*.jpg)
filecount=${#files[@]}
file=${files[$RANDOM % filecount]}
mv $file /somewhere/else

edit:// Mit head bzw. tail, so wie Suxxess es gesagt hat, geht es natürlich auch. Man braucht nichtmal eine temporäre Datei, sondern kanns gleich mit Pipes lösen:
Code:
file=$(ls *.jpg | head -n 1)
 
Zuletzt bearbeitet:
Schau dir mal die Funktion tail oder head an, ggf. muss man die nachinstallieren.
Bei tail kann man das z.B. so hinbekommen, dass er nur die zwei Zeile von unten aus einer Dateiliste auslist.

Sprich mit ls order >/home/user/dateiliste.txt solltest du deine Dateiliste bekommen.
dann kannst du mail 'tail -a2 dateiliste.txt' solltest du nur die zweite Spalte von unten bekommen und somit den korrekten Dateinamen herausbekommen können für deinen Move Befehl.

das -a2 war jetzt ein Beispiel schau dir dazu die Man-Page an, wenn du willst schau ich mal in mein Script was ich mal vor einer längeren Zeit gebastelt habe. ;) Aber mit dem Ansatz solltest du weiterkommen können.
 
Danke stwe

head war genau das was ich gesucht hatte.

Danke auch an Suxxess, mal schaun welche Methode ich jetzt nutzen werden, möglich sind natürlich alle.
 
Zuletzt bearbeitet:
Kleine Randbemerkung.

Linux arbeitet Case Sensitive. Das bedeutetdas Groß und Kleinschreibung peinlichst genau beachtet wird. Für Linux ist die Datei TEST.jpg nicht gleich die Datei Test.JPG .
 
Zurück
Oben