ubuntuusers.de

Einfach Kopierskript mit yad läuft nicht

Status: Ungelöst | Ubuntu-Version: Xubuntu 16.04 (Xenial Xerus)
Antworten |

Fried-rich

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1162

Hi,

ich habe hier ein einfaches Skript um Downloads von meinem Downloadsserver (Raspberry Pi, nur 100er LAN) auf meinen PC zu kopieren. Das ganze ist eine Endlosschleife und dafür gedacht zu laufen wenn der PC gerade an ist und immer wieder nach aktuellen Downloads auf dem Pi zu suchen. Lass ich meist laufen wenn der Pi etwas herunterlädt und ich z B. längere Videoencodings mit dem PC mache. Das ganze sieht so aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/bin/bash
quelle="$(yad --title="Field Optionen" --form --item-separator=, --separator=" " --field="Verzeichnisauswahl:DIR" --button="OK")"
ziel="/media/hdd2/Ordner/"

while true
 do
  for i in "$quelle"/*.rar
   do
    cp -n -v "$i" "$ziel"
   done
 done

Bisher war bei Quelle auch ein absoluter Pfad zu ändern, hab ich einfach manuell gemacht und das ganze lief. Jetzt wollte ich die Ordnerauswahl über ein Fenster mit yad umsetzen, hier erstmal testweise nur für den Quellordner. Das läuft aber irgendwie auf Fehler. Wenn ich den Quellordner auswähle kommt im Terminal:

1
cp: Aufruf von stat für '/autofs/raspberry-pi-usb/pfad/zum/download /*.rar' nicht möglich: Datei oder Verzeichnis nicht gefunden

Ein anderes Problem ist das Leerzeichen nach dem Ordnernamen und vor dem /. Ich vermute das liegt an der Option '--separator" "'. Wenn ich diese aber in '--separatur=""' ändere oder weglasse wird das Skript nicht ausgeführt. Es kommt aber auch keine Meldung im Terminal. Lasse ich testweise $quelle mit 'echo $quelle > datei' in eine Datei schreiben, geht alles. Der Pfad steht dann ohne Leerzeichen in der Datei.

Hier komme ich nicht weiter.

EDIT Mit Zenity und der Zeile

1
quelle="$(zenity --file-selection --directory)"

hab ich es jetzt hinbekommen. Was jetzt aber bei yad falsch läuft weiß ich nicht.

Bearbeitet von rklm:

Syntaxhighlighting

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13219

Das Problem ist wahrscheinlich, dass nicht in allen Verzeichnissen ein .rar steht:

1
2
3
4
5
6
7
8
9
$ touch a.zip
$ ls -1
a.zip
$ echo *.zip
a.zip
$ echo *.rar
*.rar
$ echo ./*.rar
./*.rar

Wie Du in Zeilen 7 und 9 siehst, bleibt der Stern erhalten, wenn das Globbing den Namen nicht auflösen kann. Du müsstest also entweder die Bash-Option "nullglob" setzen (shopt -s nullglob) oder aber prüfen, ob die Datei vorhanden ist. Ich schreibe ja lieber Skripte für die sh, weshalb ich immer letzteres tue:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/bin/sh

quelle="$(yad --title="Field Optionen" --form --item-separator=, --separator=" " --field="Verzeichnisauswahl:DIR" --button="OK")"
ziel="/media/hdd2/Ordner/"

while true
 do
  for i in "$quelle"/*.rar
   do
    test -e "$i" && cp -n -v "$i" "$ziel"
   done
 done

Eigentlich ist die for-Schleife allerdings überflüssig, denn man kann kann das elegant mit Option -t machen:

1
2
3
4
5
6
7
8
9
#!/bin/sh

quelle="$(yad --title="Field Optionen" --form --item-separator=, --separator=" " --field="Verzeichnisauswahl:DIR" --button="OK")"
ziel="/media/hdd2/Ordner/"

while true
 do
  cp -n -v -t "$ziel" "$quelle"/*.rar
 done

Dann hat man allerdings ohne "nullglob" wieder die eklige Fehlermeldung.

Eine andere Anmerkung: der Sinn der Endlosschleife erschließt sich mir nicht. Da kann man dann lieber mit den Programmen aus dem Paket "inotify-tools" arbeiten. Das ist viel effizienter.

Ich würde auch erwägen, statt -n lieber -u zu nehmen, denn dann werden auch immer Änderungen mitkopiert. Ob das das ist, was Du willst, weiß ich natürlich nicht.

Fried-rich

(Themenstarter)

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1162

Ich war mir aber sicher, dass in den Quellordnern *.rar-Dateien drin waren. Muss ich nochmal versuchen.

Was macht denn cp -t? In der Hilfe steht

-t, --target-directory=VERZ alle QUELLE‐Argumente in VERZ kopieren

Das ist irgendwie nichtssagend.

Antworten |