lord-icon
Goto Top

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"

#!/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 ^^

Content-Key: 667557

Url: https://administrator.de/contentid/667557

Ausgedruckt am: 19.03.2024 um 07:03 Uhr

Mitglied: Lochkartenstanzer
Lochkartenstanzer 13.06.2021 um 23:31:44 Uhr
Goto Top
Moin,

müßtest Du in Zeile 5 nicht auf Ungleichheit testen, also
 
      if [ ${IN_EMPTY} -ne 0 ]

?

lks
Mitglied: HanTrio
HanTrio 13.06.2021 um 23:35:02 Uhr
Goto Top
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.
Mitglied: it-fraggle
it-fraggle 14.06.2021 um 05:37:14 Uhr
Goto Top
Zitat von @lord-icon:
ich möchte ein Verzeichnis "überwachen".
inotify oder mit systemd
Mitglied: lord-icon
lord-icon 14.06.2021 um 21:32:35 Uhr
Goto Top
So.. leider tut es Script nicht wirklich das was es soll face-sad

Einmal läuft es durch... verschiebt alle Daten und läuft dann auf Fehler.

Ich glaube auch dass ich viel zu viel gebaut habe.
Letzendlich soll es als Cronjob laufen der jede Minute geprüft (ggf. vershcoben) wird.

#!/bin/sh

# Wenn in_arbeit nicht vorhanden ist...
if [ ! -f /mnt/ssd_auslagerung/in_arbeit.txt ];
then
        # ... dann prüfe, ob es neue iso-Datein gibt. Zähle hier die Anzahl der Datein
        anzahl=(`ls /mnt/ssd_auslagerung/*.iso | wc -w`)
        # Wenn die Menge größer als 0 ist, dann fange an zu verschieben
        if [ $anzahl -gt 0 ]
        then
                #Status setzen, sodass der nächste Cronjob in einer Minute nicht auch anfängt zu verschieben
                echo > /mnt/ssd_auslagerung/in_arbeit.txt
                #Verschiebe alle *.iso-Datein
                mv /mnt/ssd_auslagerung/*.iso /mnt/usb-hdd/
                #Da nun alles abgearbeitet ist lösche wieder den Status
                rm /mnt/ssd_auslagerung/in_arbeit.txt
        fi
fi

Wenn die Status_datei.txt vorhanden ist, dann verschiebt gerade ein cronjob die Datei(n).
Klappt soweit auch.

Blöd ist nur, dass mir die Zeile
anzahl=(`ls /mnt/ssd_auslagerung/*.iso | wc -w`)
jede Minute einen Fehler pollt wenn gerade mal KEINE iso-Datei vorhanden ist=> ls: cannot access '/mnt/ssd_auslagerung/*.iso': No such file or directory

Mit @ oder /dev/null 2>&1 komme ich da nicht wirklich weiter. Nicht Kriegsentscheidend... abe vlt. hat einer ja einen Kosmetischen Hinweis face-wink
Mitglied: lord-icon
lord-icon 14.06.2021 um 21:40:04 Uhr
Goto Top
P.s. als cronjob läuft das Teil auch nicht. Muß ich mir aber morgen anschauen.... 3:30 gehts wieder raus.
Und ja... chmod +x hab ich vorher gemacht.
In den Logs kommt es auch an
Jun 14 21:39:01 system CRON[2923751]: (root) CMD (/home/me/iso-datein_verschieben.sh )
Jun 14 21:39:01 system CRON[2923750]: (CRON) info (No MTA installed, discarding output)
Mitglied: HanTrio
HanTrio 15.06.2021 um 09:06:36 Uhr
Goto Top
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
/bin/echo
anstatt von lediglich
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 ;)
Mitglied: lord-icon
lord-icon 15.06.2021 um 14:20:29 Uhr
Goto Top
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. " ` '
Mitglied: Lochkartenstanzer
Lochkartenstanzer 15.06.2021 um 14:53:22 Uhr
Goto Top
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:

> 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
Mitglied: lcer00
lcer00 15.06.2021 aktualisiert um 15:14:21 Uhr
Goto Top
Hallo,
Zitat von @lord-icon:

Kann einer mal folgendes in die Shell eingeben:

kannst Du mal in die Shell eingeben:
echo $SHELL

Grüße

lcer

PS: und am besten noch:
lsb_release -d
Mitglied: lord-icon
lord-icon 15.06.2021 aktualisiert um 15:25:58 Uhr
Goto Top
FTW...

lord_icon@system:~$ anzahl=(ˋ/bin/ls /etc/*.conf | /bin/wc -wˋ)
lord_icon@system:~$ echo $anzahl
/bin/ls /etc/adduser.conf /etc/ca-certificates.conf /etc/debconf.conf /etc/deluser.conf /etc/e2scrub.conf /etc/fuse.conf /etc/gai.conf /etc/hdparm.conf /etc/host.conf /etc/idmapd.conf /etc/ld.so.conf /etc/libaudit.conf /etc/logrotate.conf /etc/ltrace.conf /etc/mke2fs.conf /etc/multipath.conf /etc/nsswitch.conf /etc/overlayroot.conf /etc/pam.conf /etc/popularity-contest.conf /etc/request-key.conf /etc/resolv.conf /etc/rsyslog.conf /etc/sensors3.conf /etc/smartd.conf /etc/sysctl.conf /etc/ucf.conf /etc/vnstat.conf /etc/xattr.conf | /bin/wc -w


lord_icon@system:~$ /bin/ls /etc/*.conf | /bin/wc -w
29

lord_icon@system:~$ echo $SHELL
/bin/bash

lord_icon@system:~$ lsb_release -d
Description:    Ubuntu 20.04.2 LTS       
Mitglied: Lochkartenstanzer
Lochkartenstanzer 15.06.2021 aktualisiert um 15:35:00 Uhr
Goto Top
Zitat von @lord-icon:

FTW...

> lord_icon@system:~$ anzahl=(ˋ/bin/ls /etc/*.conf | /bin/wc -wˋ)
> 

Das sind keine "backticks"! da kommt nur
bash: Syntaxfehler beim unerwarteten Wort »|«

> lord_icon@system:~$ /bin/ls /etc/*.conf | /bin/wc -w
> 
Da kommt nur
 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?
Mitglied: lord-icon
lord-icon 15.06.2021 um 15:40:02 Uhr
Goto Top
lord_icon@system:~$ echo $LC_CTYPE

lord_icon@system:~$ echo $LANG
C.UTF-8
Mitglied: Lochkartenstanzer
Lochkartenstanzer 15.06.2021 aktualisiert um 16:20:15 Uhr
Goto Top
Zitat von @lord-icon:

FTW...

> lord_icon@system:~$ anzahl=(ˋ/bin/ls /etc/*.conf | /bin/wc -wˋ)
> 


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
Mitglied: lord-icon
lord-icon 15.06.2021 um 18:17:39 Uhr
Goto Top
Herjee.... auf was für Ideen du alles kommst... mit das in HEX anzeigen zu lassen um unsichtbare Steuerzeichen zu suchen.... da wäre ich in trillionen Jahre nicht drauf gekommen face-wink

Nachdem ich dein Posting rauskopiert habe... kommt nun tatsächlich ne Zahl raus.

ABER... nun bemängelt er, das ich die Schleife nicht sauber gebildet habe:

/home/lord_icon/iso-datein_verschieben.sh: 4: Syntax error: "(" unexpected (expecting "fi")


Da bin ich aber anderer Meinung.
Aufgeräumt sieht der Code wie folgt aus:
#!/bin/sh
if [ ! -f /mnt/ssd_auslagerung/in_arbeit.txt ]
then
        anzahl=(`/bin/ls /mnt/ssd_auslagerung/*.iso | /bin/wc -w`)
        if [ ${anzahl} -gt 0 ]
        then
                /bin/echo > /mnt/ssd_auslagerung/in_arbeit.txt
                /bin/mv /mnt/ssd_auslagerung/*.iso /mnt/usb-hdd/
                /bin/rm /mnt/ssd_auslagerung/in_arbeit.txt
        fi
fi
M.E.n sieht das korrekt aus. K.a. was da falsch sein soll.

Unsichtbare Steuerzeichen oder so kann ich dank deines Befehls auch ausschließen.
Das scheint nun zu passen
cat | od -c -tx1 /home/lord_icon/iso-datein_verschieben.sh
0000000   #   !   /   b   i   n   /   s   h  \n   i   f       [       !
         23  21  2f  62  69  6e  2f  73  68  0a  69  66  20  5b  20  21
0000020       -   f       /   m   n   t   /   s   s   d   _   a   u   s
         20  2d  66  20  2f  6d  6e  74  2f  73  73  64  5f  61  75  73
0000040   l   a   g   e   r   u   n   g   /   i   n   _   a   r   b   e
         6c  61  67  65  72  75  6e  67  2f  69  6e  5f  61  72  62  65
0000060   i   t   .   t   x   t       ]  \n   t   h   e   n  \n
         69  74  2e  74  78  74  20  5d  0a  74  68  65  6e  0a  20  20
0000100                           a   n   z   a   h   l   =   (   `   /
         20  20  20  20  20  20  61  6e  7a  61  68  6c  3d  28  60  2f
0000120   b   i   n   /   l   s       /   m   n   t   /   s   s   d   _
         62  69  6e  2f  6c  73  20  2f  6d  6e  74  2f  73  73  64  5f
0000140   a   u   s   l   a   g   e   r   u   n   g   /   *   .   i   s
         61  75  73  6c  61  67  65  72  75  6e  67  2f  2a  2e  69  73
0000160   o       |       /   b   i   n   /   w   c       -   w   `   )
         6f  20  7c  20  2f  62  69  6e  2f  77  63  20  2d  77  60  29
0000200  \n                                   i   f       [       $   {
         0a  20  20  20  20  20  20  20  20  69  66  20  5b  20  24  7b
0000220   a   n   z   a   h   l   }       -   g   t       0       ]  \n
         61  6e  7a  61  68  6c  7d  20  2d  67  74  20  30  20  5d  0a
0000240                                   t   h   e   n  \n
         20  20  20  20  20  20  20  20  74  68  65  6e  0a  20  20  20
0000260                                                       /   b   i
         20  20  20  20  20  20  20  20  20  20  20  20  20  2f  62  69
0000300   n   /   e   c   h   o       >       /   m   n   t   /   s   s
         6e  2f  65  63  68  6f  20  3e  20  2f  6d  6e  74  2f  73  73
0000320   d   _   a   u   s   l   a   g   e   r   u   n   g   /   i   n
         64  5f  61  75  73  6c  61  67  65  72  75  6e  67  2f  69  6e
0000340   _   a   r   b   e   i   t   .   t   x   t  \n
         5f  61  72  62  65  69  74  2e  74  78  74  0a  20  20  20  20
0000360                                                   /   b   i   n
         20  20  20  20  20  20  20  20  20  20  20  20  2f  62  69  6e
0000400   /   m   v       /   m   n   t   /   s   s   d   _   a   u   s
         2f  6d  76  20  2f  6d  6e  74  2f  73  73  64  5f  61  75  73
0000420   l   a   g   e   r   u   n   g   /   *   .   i   s   o       /
         6c  61  67  65  72  75  6e  67  2f  2a  2e  69  73  6f  20  2f
0000440   m   n   t   /   u   s   b   -   h   d   d   /  \n
         6d  6e  74  2f  75  73  62  2d  68  64  64  2f  0a  20  20  20
0000460                                                       /   b   i
         20  20  20  20  20  20  20  20  20  20  20  20  20  2f  62  69
0000500   n   /   r   m       /   m   n   t   /   s   s   d   _   a   u
         6e  2f  72  6d  20  2f  6d  6e  74  2f  73  73  64  5f  61  75
0000520   s   l   a   g   e   r   u   n   g   /   i   n   _   a   r   b
         73  6c  61  67  65  72  75  6e  67  2f  69  6e  5f  61  72  62
0000540   e   i   t   .   t   x   t  \n
         65  69  74  2e  74  78  74  0a  20  20  20  20  20  20  20  20
0000560   f   i  \n   f   i  \n
         66  69  0a  66  69  0a
0000566
Mitglied: HanTrio
HanTrio 15.06.2021 um 18:32:31 Uhr
Goto Top
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 ;)
Mitglied: Lochkartenstanzer
Lochkartenstanzer 15.06.2021 aktualisiert um 18:36:10 Uhr
Goto Top
Probiere mal

 anzahl="`/bin/ls /media | /usr/bin/wc -w`"  
oder
 anzahl=$(/bin/ls /media | /usr/bin/wc -w)


lks