(gelöst) script-Syntax für Dateiverschiebung

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
guennid

(gelöst) script-Syntax für Dateiverschiebung

Beitrag von guennid » 29.12.2018 13:19:00

Wenn ich im Terminal formuliere:

Code: Alles auswählen

mv /<q-pfad>/asdfg*.txt /<z-pfad>
dann funktioniert das.

Schreibe ich in einem script

Code: Alles auswählen

if [ -f /<q-pfad>/asdfg*.txt ]
  then mv /<q-pfad>/asdfg*.txt /<z-pfad>
fi
Dann funktioniert das nicht. Lass ich den Platzhalter weg und schreibe den Namen einer konkreten Datei funtioniert's wieder.

Zusatzfrage: der Parameter -f wird nach meiner Kenntnis für "reguläre" Dateien verwendet. Was versteht man unter regulären Dateien und was wären demgemäss nicht-reguläre Dateien? Wo wäre der Unterschied, wenn ich das -f durch ein -e ersetzte?
Ich habe versucht, mich hier (1) schlau zu machen.
(1) https://wiki.ubuntuusers.de/Shell/Bash- ... C3%A4nger/

Grüße, Günther
Zuletzt geändert von guennid am 29.12.2018 15:10:01, insgesamt 1-mal geändert.

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: script-Syntax für Dateiverschiebung

Beitrag von smutbert » 29.12.2018 13:45:30

Dein Platzhalter, ich nehme an du meinst den Stern, wird ja von der Shell zu allen darauf passenden Dateinamen expandiert. Hast du also beispielsweise nur die Datei »asdfg1.txt«, dann sehe ich keinen Grund warum es scheitern sollte, aber bereits bei 2 Dateien, etwa »asdfg1.txt« und »asdfg2.txt« wird deine Abfrage zu

Code: Alles auswählen

[ -f /<q-pfad>/asdfg1.txt /<q-pfad>/asdfg2.txt ]
und das ist ein Argument zu viel für test/[ und es folgt eine Fehlermeldung. zum Beispiel
test: too many arguments
oder
bash: test: /<q-pfad>/asdfg1.txt: Zweistelliger (binärer) Operator erwartet.
Die üblichen nicht-regulären Dateien tauchen fast alle mit eigenen Optionen in der manpage auf, als da wären
- Verzeichnisse
- symbolische Links
- named Pipes (kenne kein deutsches Wort dafür)
- Sockets (das traue ich mich nicht zu übersetzen)
- spezielle Gerätedateien (Blockgeräte, Zeichengeräte (Zeichen wie Buchstaben nicht Zeichen wie zeichnen))

guennid

Re: script-Syntax für Dateiverschiebung

Beitrag von guennid » 29.12.2018 14:10:38

Hmmm, einleuchtende Erklärung, löst aber leider noch nicht mein Problem. Schleife, die alle Dateien im Verzeichnis daraufhin überprüft, ob ihr Name dem Muster entspricht und die dann verschiebt? Mit Pascal kriegte ich das hin, aber mit Shell-Syntax ...? :wink:

Grüße, Günther

Huo
Beiträge: 614
Registriert: 26.11.2017 14:03:31
Wohnort: Freiburg

Re: script-Syntax für Dateiverschiebung

Beitrag von Huo » 29.12.2018 14:12:24

Du könntest in einer for-Schleife die fraglichen Dateien einzeln abarbeiten:

Code: Alles auswählen

for d in /<q-pfad>/asdfg*.txt; do
    mv $d /<z-pfad>
done

guennid

Re: script-Syntax für Dateiverschiebung

Beitrag von guennid » 29.12.2018 15:06:11

Ich weiß nicht, was Huos "d" ist.
Ich hab's so gemacht:

Code: Alles auswählen

for file in /<q-pfad>/asdfg*.txt ; do
    mv $file /<z-pfad>
done
Ist das Leerzeichen zwischen dem Suchmuster und dem Semikolon optional?
Die englischsprachige manpage von file versteh' ich zwar nicht, aber irgendwie ist das wohl eine Funktion, die in der von mir gewählten Form einen String mit allen Dateinamen im angegebenen Verzeichnis aufnimmt/in eine gleichnamige Variable schreibt?

Grüße, Günther

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: (gelöst) script-Syntax für Dateiverschiebung

Beitrag von smutbert » 29.12.2018 15:44:47

d bzw file (und entsprechend $d und $file) ist in diesem Codeschnipsel lediglich der Name der Variable in der der Dateiname gespeichert wird. Es hat absolut nichts mit dem Befehl file zu tun.

guennid

Re: (gelöst) script-Syntax für Dateiverschiebung

Beitrag von guennid » 29.12.2018 16:16:44

Was Huos "d" angeht hatte ich mir das fast so auch gedacht, und dass die Shell-Syntax alles und jedes als Variable interpretieren kann ohne dass man diese vorher deklariert und typisiert haben müsste, das wusste ich auch, aber wie sie nun dazu kommt eine x-beliebig benamte Variable mit (welchen?) Dateinamen zu befüllen, erschließt sich mir einstweilen noch nicht.

Ob das Leerzeichen im "Schnipsel" optional ist, weiß ich auch noch nicht. Ich glaube zu wissen, dass ein solches, je nachdem wo's steht, verpflichtend sein kann.

Grüße, Günther

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: (gelöst) script-Syntax für Dateiverschiebung

Beitrag von smutbert » 29.12.2018 16:41:39

Das Zuweisen passiert in der for-Schleife »for var in ...« und das Leerzeichen an dieser Stelle spielt keine Rolle. Es dient nur dazu den Ende des Kommandos mit for anzuzeigen. Ein Zeilenumbruch funktioniert genauso

Code: Alles auswählen

for i in /<q-pfad>/asdfg*.txt
do
    mv $i /<z-pfad>
done

Huo
Beiträge: 614
Registriert: 26.11.2017 14:03:31
Wohnort: Freiburg

Re: (gelöst) script-Syntax für Dateiverschiebung

Beitrag von Huo » 29.12.2018 16:43:47

guennid hat geschrieben: ↑ zum Beitrag ↑
29.12.2018 15:06:11
Ist das Leerzeichen zwischen dem Suchmuster und dem Semikolon optional?
Ja – aber das Semikolon selbst ist erforderlich, da mit dem "do" ein neuer Befehl innerhalb der Zeile beginnt. Man kann sich das Semikolon als Befehlstrenner allerdings sparen, indem man das "do" in eine neue Zeile setzt.

Code: Alles auswählen

for file in /<q-pfad>/asdfg*.txt
do
    mv $file /<z-pfad>
done
Edit: Überschneidung mit smutberts Post :P

guennid

Re: (gelöst) script-Syntax für Dateiverschiebung

Beitrag von guennid » 29.12.2018 17:12:56

Anahnd von Einrückungskonventionen hätte ich zwar vermutet, dass das "done" das Scheifenende markiert. Ich weiß nicht, was ich mir unter

Code: Alles auswählen

for i in /pfad/*
als "komplettem Kommando vorstellen soll. Eher als das Semikolon/der Zeilenumbruch sollte dann doch nach meinem logischen Verständnis das "do" überflüssig sein, zumindest eins/(zwei) der drei "Ausdrücke". Aber belassen wir's dabei. Ich merk mir, dass

Code: Alles auswählen

for  <irgendwas> in <rgendwas>
ein komplettes Kommando ist und dass das "do" zwar wahrscheinlich auch irgendwie dazu gehört, aber eben nur "irgendwie". Ich erlaube mir einstweilen, diese Syntax für fürchterlich zu halten. :wink:

Grüße, Günther
Zuletzt geändert von guennid am 29.12.2018 17:19:34, insgesamt 1-mal geändert.

tobo
Beiträge: 1991
Registriert: 10.12.2008 10:51:41

Re: (gelöst) script-Syntax für Dateiverschiebung

Beitrag von tobo » 29.12.2018 17:18:35

Es wäre dann noch stark anzuraten $file beim mv zu quoten und wenn man es ganz genau machen will, dann prüft man vor dem mv noch auf Existenz der Datei (falls nämlich kein Treffer, dann will das Muster verschoben werden).

guennid

Re: (gelöst) script-Syntax für Dateiverschiebung

Beitrag von guennid » 29.12.2018 17:25:26

Mit dem Begriff "quoten" vermage ich ebenfalls nichts anzufangen, ich vermute, du meinst nicht: "zitieren"?

Grüße, Günther

edit
Gemeint scheint zu sein "In Anführungszeichen setzen". Und der Grund wäre vielleicht, dass Leerzeichen im Dateinamen vorkommen könnten. Soweit richtig? Bei mir gibt's keine Leerzeichen in Dateinamen. Aber sei's drum: Weiter zu fragen wäre dann: welche Anführungszeichen. Wenn ich die bereits zitierte Anleitung richtig lese: doppelte, keine einfachen und schon gar keine typografischen.

Code: Alles auswählen

mv "$file"
würde also die Datei verschieben, auch wenn sie Leerzeichen enthielte - richtig?

tobo
Beiträge: 1991
Registriert: 10.12.2008 10:51:41

Re: (gelöst) script-Syntax für Dateiverschiebung

Beitrag von tobo » 29.12.2018 19:14:49

Genau, in doppelte Anführungszeichen. Danach würden auch Dateinamen mit Leerzeichen, Zeilenumbrüchen, etc. weiterhin funktionieren. Bei enfachen Anführungszeichen würde ja auch die Variable gar nicht aufgelöst werden können.

do-done begrenzt den Schleifenrumpf und ist auch nur ein syntaktisches, zur for-Schlefe gehörendes Merkmal (zusammengesetzer Befehl). Also nichts anderes als ein erforderliches begin-end in Pascal. Das Semikolon ist zur Trennung von Parameterliste und Schleife erforderlich, wenn kein Zeilenumbruch verwendet wird:

Code: Alles auswählen

for i in *.txt do
##wird z.B. zu
for i in a.txt b.txt c.txt do
Die Shell expandiert das *.txt, setzt es ein und benötigt dann einen formalen Trenner zwischen c.txt und do.

guennid

Re: (gelöst) script-Syntax für Dateiverschiebung

Beitrag von guennid » 29.12.2018 19:51:27

Danke sehr!

habe ich file richtig "gequotet"? :wink:

tobo
Beiträge: 1991
Registriert: 10.12.2008 10:51:41

Re: (gelöst) script-Syntax für Dateiverschiebung

Beitrag von tobo » 29.12.2018 21:51:27

Ja, außerdem die einzig mögliche Art!?

Code: Alles auswählen

for file in /<q-pfad>/asdfg*.txt; do
  [ -f "$file" ] && mv "$file" /<z-pfad>/
done

Antworten