Datei verschieben, wenn vorhanden
ich möchte ein Verzeichnis "überwachen".
Es bestehen je nach Kopierzustand (von ein anderem Script) 2 Zustände.
<dateiname>.iso.tmp => der Zustand ist zu ignorieren, da noch kopiert wird.
<dateiname>.iso => ab hier möchte ich "angreifen"
Bisher sagt mir meine Consoole immer nur sleep obwohl der Befehl "ls /mnt/ssd_auslagerung/*.iso | wc -w" eine 1 ausgibt und somit den mv-Befehl ausführen sollte.
Irgendwas stimmt mit den Kopf nicht.... bin aber schon zu lange an der Sache dran und seh den Wald vor lauter Bäumen nicht.
Brauche mal frisches Hirn ^^
Es bestehen je nach Kopierzustand (von ein anderem Script) 2 Zustände.
<dateiname>.iso.tmp => der Zustand ist zu ignorieren, da noch kopiert wird.
<dateiname>.iso => ab hier möchte ich "angreifen"
#!/bin/bash
for i in /mnt/ssd_auslagerung/*.iso ; do
while true; do
IN_EMPTY=(`ls /mnt/ssd_auslagerung/*.iso | wc -w`)
if [ ${IN_EMPTY} -eq 0 ]
then
mv ${i} /mnt/usb-hdd/
echo verschiebe ${i}
# break
else
sleep 10
echo sleep
fi
done
done
Bisher sagt mir meine Consoole immer nur sleep obwohl der Befehl "ls /mnt/ssd_auslagerung/*.iso | wc -w" eine 1 ausgibt und somit den mv-Befehl ausführen sollte.
Irgendwas stimmt mit den Kopf nicht.... bin aber schon zu lange an der Sache dran und seh den Wald vor lauter Bäumen nicht.
Brauche mal frisches Hirn ^^
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 667557
Url: https://administrator.de/contentid/667557
Ausgedruckt am: 22.11.2024 um 07:11 Uhr
16 Kommentare
Neuester Kommentar
So auf den ersten Blick - deine if-condition ist genau falsch rum ;)
Also wenn IN_EMPTY, wie du schreibst, mit 1 befüllt wird, ist klar, warum der Vergleich mit "-eq 0" negativ ausfällt, und somit zum "else" Teil gesprungen wird.
Es müsste "-ne 0" (not equal 0) heißen, dann sollte die if-condition greifen, und "then" ausgeführt werden.
Also wenn IN_EMPTY, wie du schreibst, mit 1 befüllt wird, ist klar, warum der Vergleich mit "-eq 0" negativ ausfällt, und somit zum "else" Teil gesprungen wird.
Es müsste "-ne 0" (not equal 0) heißen, dann sollte die if-condition greifen, und "then" ausgeführt werden.
inotify oder mit systemd
Allgemein zum Thema Cronjobs bei Verwendung eines Scripts:
Achte im Zweifelsfall darauf, innerhalb des Scripts nicht nur die üblichen Commands zu verwenden, sondern den absoluten Dateipfad zu den binaries, also zB
anstatt von lediglich
Alternativ kannst du dem Cronjob mitteilen, wo sich die binaries befinden, indem du die PATH Variable innerhalb des Crontabs explizit mitgibst bzw. erweiterst. Hier ganz gut beschrieben:
https://stackoverflow.com/questions/2388087/how-to-get-cron-to-call-in-t ...
https://unix.stackexchange.com/questions/148133/how-to-set-crontab-path- ...
Erfahrungsgemäß ist das DIE Fehlerquelle, wenn ein Script an sich funktioniert, aber nicht als Cronjob laufen will ;)
Achte im Zweifelsfall darauf, innerhalb des Scripts nicht nur die üblichen Commands zu verwenden, sondern den absoluten Dateipfad zu den binaries, also zB
/bin/echo
echo
Alternativ kannst du dem Cronjob mitteilen, wo sich die binaries befinden, indem du die PATH Variable innerhalb des Crontabs explizit mitgibst bzw. erweiterst. Hier ganz gut beschrieben:
https://stackoverflow.com/questions/2388087/how-to-get-cron-to-call-in-t ...
https://unix.stackexchange.com/questions/148133/how-to-set-crontab-path- ...
Erfahrungsgemäß ist das DIE Fehlerquelle, wenn ein Script an sich funktioniert, aber nicht als Cronjob laufen will ;)
Zitat von @lord-icon:
Danke HanTrio,
da waren schon mal hilfeiche Tipps dabei.
Ich hab im Script aber ein Problem gefunden was nicht korrekt umgesetzt wird.
Der Pipe wird nicht umgesetzt
Kann einer mal folgendes in die Shell eingeben:
Ich bekomme hier alle conf Datein angezeigt in etc angezeigt + den Anhang: | wc -w
Der Befehl wird also nicht umgesetzt. Ich finde im Web aber auch nichts.
Schon in allen erdenklichen Hochkommas etc versucht. Greift nicht. " ` '
Danke HanTrio,
da waren schon mal hilfeiche Tipps dabei.
Ich hab im Script aber ein Problem gefunden was nicht korrekt umgesetzt wird.
Der Pipe wird nicht umgesetzt
Kann einer mal folgendes in die Shell eingeben:
> test=(`ls /etc/*.conf | wc -w`)
> echo $test
>
Ich bekomme hier alle conf Datein angezeigt in etc angezeigt + den Anhang: | wc -w
Der Befehl wird also nicht umgesetzt. Ich finde im Web aber auch nichts.
Schon in allen erdenklichen Hochkommas etc versucht. Greift nicht. " ` '
lks@nana:~$ test=(`ls /etc/*.conf | wc -w`)
lks@nana:~$ echo $test
42
lks@nana:~$
lks
Hallo,
kannst Du mal in die Shell eingeben:
Grüße
lcer
PS: und am besten noch:
kannst Du mal in die Shell eingeben:
echo $SHELL
Grüße
lcer
PS: und am besten noch:
lsb_release -d
Das sind keine "backticks"! da kommt nur
bash: Syntaxfehler beim unerwarteten Wort »|«
> lord_icon@system:~$ /bin/ls /etc/*.conf | /bin/wc -w
>
bash: /bin/wc: Datei oder Verzeichnis nicht gefunden
Bei mir ist der Pfad zu wc /usr/bin/wc
Irgendwie ist es bei Dir anscheinend verkorkst. (ich habe auch ein Ubuntu 20.04.2 LTS)
lks
PS:
Was sagen denn echo $LC_CTYPE und echo $LANG?
Wenn ich mit Deine Zeile mit od anschaue, kommt das raus:
~$ cat | od -c -tx1
anzahl=(ˋ/bin/ls /etc/*.conf | /bin/wc -wˋ)
0000000 a n z a h l = ( 313 213 / b i n / l
61 6e 7a 61 68 6c 3d 28 cb 8b 2f 62 69 6e 2f 6c
0000020 s / e t c / * . c o n f |
73 20 2f 65 74 63 2f 2a 2e 63 6f 6e 66 20 7c 20
0000040 / b i n / w c - w 313 213 ) \n
2f 62 69 6e 2f 77 63 20 2d 77 cb 8b 29 0a
0000056
Bei meiner zeile steht das:
~$ cat | od -c -tx1
test=(`ls /etc/*.conf | wc -w`)
0000000 t e s t = ( ` l s / e t c / *
74 65 73 74 3d 28 60 6c 73 20 2f 65 74 63 2f 2a
0000020 . c o n f | w c - w ` ) \n
2e 63 6f 6e 66 20 7c 20 77 63 20 2d 77 60 29 0a
0000040
Du hast zwischen wc -c und dem backtick ein zeichen mit dem Code cb 8b drin, statt "backtick" (=60hex ) !
https://ascii.cl/
Achte darauf, welche Zeichen Du wirklich eintippst!
lks
Vielleicht noch eine generelle Anmerkung:
Mach dich mal schlau über die sog. "command substitution":
Die Verwendung von Backticks ist zwar immer noch möglich, aber seit längerer Zeit .. wie sag ich das nett .. quasi obsolet ;)
Anstatt von
kannst (und solltest) du
verwenden.
Siehe auch hier:
https://stackoverflow.com/questions/4708549/what-is-the-difference-betwe ...
https://stackoverflow.com/questions/9449778/what-is-the-benefit-of-using ...
http://mywiki.wooledge.org/BashFAQ/082
Dann ersparst du dir nicht nur die Problematik mit dem hier offensichtlich falschen Zeichen, sondern auch später jede Menge Kopfschmerzen, wenn es an komplexere "nested" commands geht ;)
Mach dich mal schlau über die sog. "command substitution":
Die Verwendung von Backticks ist zwar immer noch möglich, aber seit längerer Zeit .. wie sag ich das nett .. quasi obsolet ;)
Anstatt von
`...`
$(...)
Siehe auch hier:
https://stackoverflow.com/questions/4708549/what-is-the-difference-betwe ...
https://stackoverflow.com/questions/9449778/what-is-the-benefit-of-using ...
http://mywiki.wooledge.org/BashFAQ/082
Dann ersparst du dir nicht nur die Problematik mit dem hier offensichtlich falschen Zeichen, sondern auch später jede Menge Kopfschmerzen, wenn es an komplexere "nested" commands geht ;)