staging.inyokaproject.org

Datei auf Netzwerkspeicher kopieren

Status: Ungelöst | Ubuntu-Version: Xubuntu 18.04 (Bionic Beaver)
Antworten |

Fried-rich

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1162

Hallo,

ich habe ein Kontextmenü erstellt um Dateien direkt auf meine Fritzbox kopieren zu können. Das Kontextmenü startet ein Script, das so aussieht:

#!/bin/bash
for file; do
 datei=$(basename "$file")
 zieldatei=/automount/fritzbox/$datei
 if [ -f "$zieldatei" ]
  then
   exit
  else
   pv  "$file" > /automount/fritzbox/"$datei"
 fi
done

Eigentlich sollte für jede markierte Datei geprüft werden ob sie auf dem Netzwerkspeicher schon existiert und wenn nicht kopiert werden. Ich verwende pv da es mir eine Fortschrittsanzeige im Terminal anzeigt. Während des ganzen Vorganges ist ein Terminalfenster eingeblendet. Problem: Das geht nur, wenn die erste Datei noch nicht existiert.

Angenommen auf dem Netzwerkspeicher existiert schon 001.jpg. Ich markiere auf dem Rechner 001.jpg und 002.jpg. Dann sollte eigentlich nur 002.jpg kopiert werden, da ja 001.jpg schon existiert. Es wird aber überhaupt nichts kopiert. Markiere ich nur 002.jpg geht es. Ich vermute hier ist irgendwie ein Fehler drin, dass er nur 01.jpg prüft und dann komplett abbricht.

Der Start des ServiceMenüs in der Desktop-Datei erfolgt so:

lxterminal -e /home/user/.copy-fritzbox %F

rleofield

Avatar von rleofield

Anmeldungsdatum:
14. September 2008

Beiträge: 798

Fried-rich schrieb:

Hallo,

ich habe ein Kontextmenü erstellt um Dateien direkt auf meine Fritzbox kopieren zu können. Das Kontextmenü startet ein Script, das so aussieht:

#!/bin/bash
for file; do
 datei=$(basename "$file")
 zieldatei=/automount/fritzbox/$datei
 if [ -f "$zieldatei" ]
  then
   exit
  else
   pv  "$file" > /automount/fritzbox/"$datei"
 fi
done

Eigentlich sollte für jede markierte Datei geprüft werden ob sie auf dem Netzwerkspeicher schon existiert und wenn nicht kopiert werden. Ich verwende pv da es mir eine Fortschrittsanzeige im Terminal anzeigt. Während des ganzen Vorganges ist ein Terminalfenster eingeblendet. Problem: Das geht nur, wenn die erste Datei noch nicht existiert.

Angenommen auf dem Netzwerkspeicher existiert schon 001.jpg. Ich markiere auf dem Rechner 001.jpg und 002.jpg. Dann sollte eigentlich nur 002.jpg kopiert werden, da ja 001.jpg schon existiert.

Nach der ersten Datei, die existiert, kommt das 'exit'. Alle folgenden Dateien werden nicht mehr kopiert.
Das ist nicht das, was du willst, steht aber so da.
Versuch es mal mit 'continue'.

Woher kommen die Dateinamen? Die Liste ist leer.

Es wird aber überhaupt nichts kopiert. Markiere ich nur 002.jpg geht es. Ich vermute hier ist irgendwie ein Fehler drin, dass er nur 01.jpg prüft und dann komplett abbricht.

Der Start des ServiceMenüs in der Desktop-Datei erfolgt so:

lxterminal -e /home/user/.copy-fritzbox %F

Fried-rich

(Themenstarter)

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1162

Was meinst du mit woher kommen die Dateinamen? Welche Liste? Die Dateien werden durch das ServiceMenü übergeben. DAS geht definitiv.

rleofield

Avatar von rleofield

Anmeldungsdatum:
14. September 2008

Beiträge: 798

Fried-rich schrieb:

Was meinst du mit woher kommen die Dateinamen? Welche Liste? Die Dateien werden durch das ServiceMenü übergeben. DAS geht definitiv.

und das 'exit'?
Das beendet vermutlich das Script, wenn die erste Datei gefunden wird, die existiert.

1
2
3
4
 if [ -f "$zieldatei" ]
  then
   exit
...

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

rleofield schrieb:

Nach der ersten Datei, die existiert, kommt das 'exit'. Alle folgenden Dateien werden nicht mehr kopiert.
Das ist nicht das, was du willst, steht aber so da.
Versuch es mal mit 'continue'.

Oder so:

1
2
3
4
5
6
#!/bin/sh

for file; do
 zieldatei="/automount/fritzbox/${file##*/}"
 test -f "$zieldatei" || pv "$file" > "$zieldatei"
done

Anmerkung: im ursprünglichen Skript wurde $zieldatei nur ein Mal benutzt, obwohl es zwei mögliche Verwendungen gibt. Das ist unpraktisch, weil man dann doppelte Arbeit macht. Den basename kann man durch eine Parameter-Expansion ersetzen. Ach ja, und man braucht die bash hier nicht.

Woher kommen die Dateinamen? Die Liste ist leer.

Die Form ohne in liest die Zeichenketten aus der Kommandozeile.

Antworten |