ubuntuusers.de

Datei speichern falls nicht vorhanden, sonst Frage wiederholen

Status: Gelöst | Ubuntu-Version: Ubuntu 14.10 (Utopic Unicorn)
Antworten |

Deavy

Anmeldungsdatum:
11. Oktober 2012

Beiträge: 126

Wohnort: Berlin

Hi,

bevor ich noch ewig im Netz suche frag ich einfach mal hier ist bestimmt ganz leicht ☺

Also wenn ich mit read einen Dateinamen speichern will sagen wir ich gebe dann "datei" ein nur im Ordner existiert die datei schon, wie mach ich das dann dass die frage wiederholt wird bis ein passender Dateiname gefunden wurde?

mfg Deavy

mrkramps Team-Icon

Avatar von mrkramps

Anmeldungsdatum:
10. Oktober 2006

Beiträge: 5523

Wohnort: south central EL

If-Abfrage mit einem File test operator 🇬🇧.

Deavy

(Themenstarter)

Anmeldungsdatum:
11. Oktober 2012

Beiträge: 126

Wohnort: Berlin

Das ging aber schnell danke ☺

Und wie mach ich das das er automatich die Frage wiederholt?

g00d.morning

Anmeldungsdatum:
20. Februar 2013

Beiträge: 330

Morgen 😉

Sowas z.B.?

1
2
3
4
5
6
7
#!/bin/bash
while [[ ! $filename ]] || [[ -e $filename ]]; do
        read -p "Geben Sie einen Dateinamen an: " filename
        if [[ -e $filename ]]; then
                echo "Die Datei $(pwd)/$filename existiert bereits."
        fi
done

Diese while-Schleife prüft, ob die Variable leer ist oder eine Datei/ein Order im aktuellen Verzeichnis mit gleichem Namen existiert. Das "!" ist eine Negation (in diesem Fall von Existenz).

Deavy

(Themenstarter)

Anmeldungsdatum:
11. Oktober 2012

Beiträge: 126

Wohnort: Berlin

Ja schaut schonmal gut aus und wo schreib ich den Befehl hin der dann ausgeführt werden soll?

geht es nicht auch einfach so?

1
2
3
4
5
6
7
8
read -p "Name: " rec
if [ -e "$rec.ts" ]
then
echo "Datei schon Vorhanden."
sh /pvr.sh
else
cat /dev/video0 > $HOME/Videos/PVR/$rec.ts
fi

also das falls die Datei schon vorhanden ist einfach das Script nochmal neustartet, oder ist das problematisch wegen den prozessen oder sonstigem?

Andernfalls wäre es auch möglich einfach hinten an die Datei eine steigende Nummer anzuhängen.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Wenn das Skript immer wieder sich selber aufruft, und Du 200 vergebliche Versuche hast, dann startest Du das Ding ja 200x ineinander.
Das heißt, dass es hinterher auch 200x versucht, sich irgendwie zu Ende zu bringen ... (ist also nicht so ganz das Wahre)

Sinnvollerweise würde man wohl eine while - Schleife verwenden:

1
2
3
4
5
6
7
read -p "Name: " rec
while [ -e "$rec.ts" ] ; do
    echo "Datei schon vorhanden."
    read -p "neuer Name: " rec
done

cat /dev/video0 > $HOME/Videos/PVR/$rec.ts

LG,

track

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13353

g00d.morning schrieb:

1
2
3
4
5
6
7
#!/bin/bash
while [[ ! $filename ]] || [[ -e $filename ]]; do
        read -p "Geben Sie einen Dateinamen an: " filename
        if [[ -e $filename ]]; then
                echo "Die Datei $(pwd)/$filename existiert bereits."
        fi
done

Die Ausgabe der Meldung, dass die Datei existiert hat zwei Probleme:

  1. Du testest mit "-e", d.h. das Objekt kann auch ein Verzeichnis, ein Socket oder was auch immer sein. Von daher ist der Text nicht ganz richtig.

  2. Wenn ein absoluter Pfad angegeben wird, dann ist das Voranstellen von $(pwd) falsch.

Diese while-Schleife prüft, ob die Variable leer ist oder eine Datei/ein Order im aktuellen Verzeichnis mit gleichem Namen existiert.

Man kann sich ein Paar von Klammern sparen und die Bedingung in diesem Fall auch so schreiben:

1
while [[ ! $filename || -e $filename ]]; do

Damit das wirklich robust wird, müsste man noch ein unset filename vor die Schleife setzen. 😉 Eine andere Variante sähe so aus und würde einen Test sparen:

1
2
3
4
5
6
7
8
9

filename=.

while [[ -e $filename ]]; do
        read -p "Geben Sie einen Dateinamen an: " filename
        [[ -e $filename ]] && echo "'$filename' existiert bereits."
        # Alternative mit absolutem Pfad:
        # [[ -e $filename ]] && echo "'$(readlink -f "$filename")' existiert bereits."
done

Das "!" ist eine Negation (in diesem Fall von Existenz).

Das ist nicht ganz richtig. In diesem Fall ist der negierte Test der auf eine nicht leere Zeichenkette. Das ist die Beschreibung des Tests in der Manpage der bash:

       string
       -n string
              True if the length of string is non-zero.

Es ist also egal, ob "filename" mit einem leeren String angelegt wurde oder gar nicht existiert.

g00d.morning

Anmeldungsdatum:
20. Februar 2013

Beiträge: 330

rklm schrieb:

1
2
3
4
5
6
7
8
9

filename=.

while [[ -e $filename ]]; do
        read -p "Geben Sie einen Dateinamen an: " filename
        [[ -e $filename ]] && echo "'$filename' existiert bereits."
        # Alternative mit absolutem Pfad:
        # [[ -e $filename ]] && echo "'$(readlink -f "$filename")' existiert bereits."
done

Hallo rklm. Ich habe ein nur ein Beispiel gegeben (mit ein paar ungenauen Aussagen, zugegeben). Dein Beispiel ist aber - mit Verlaub - auch nicht ganz solide. Dieses Script würde ja einen leeren String erlauben. Denn "." würde mit einem leeren String überschrieben, wenn man nur Enter drückt.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13353

g00d.morning schrieb:

Dein Beispiel ist aber - mit Verlaub - auch nicht ganz solide. Dieses Script würde ja einen leeren String erlauben. Denn "." würde mit einem leeren String überschrieben, wenn man nur Enter drückt.

Guter Punkt! Dann kommt man um die zweifache Bedingung nicht herum. Schade eigentlich. Danke für die Rückmeldung!

Bis dann

robert

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7825

track schrieb:

Wenn das Skript immer wieder sich selber aufruft, und Du 200 vergebliche Versuche hast, dann startest Du das Ding ja 200x ineinander.

Das kann man mit exec umgehen.

Aber solche rekursiven Skripte sind schwer zu verstehen. Dann lieber eine saubere while-Schleife.

Du musst nicht nur prüfen daß die Datei noch nicht existiert - dabei ordentlich quoten, also immer "$file" statt $file - sondern auch daß sie sich erstellen läßt (z.B. mit touch), sonst akzeptierst du illegale Dateinamen und hast dann später ein Problem.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13353

frostschutz schrieb:

Du musst nicht nur prüfen daß die Datei noch nicht existiert - dabei ordentlich quoten, also immer "$file" statt $file

Tatsächlich dürfte das Quoten in [[ ]] überflüssig sein, denn lt. Manpage der bash:

       [[ expression ]]
              Return a status of 0 or 1 depending  on  the  evaluation  of  the  conditional  expression  expression.
              Expressions  are  composed of the primaries described below under CONDITIONAL EXPRESSIONS.  Word split‐
              ting and pathname expansion are not performed on the words between the  [[  and  ]];  tilde  expansion,
              parameter and variable expansion, arithmetic expansion, command substitution, process substitution, and
              quote removal are performed.  Conditional operators such as -f must be unquoted  to  be  recognized  as
              primaries.

- sondern auch daß sie sich erstellen läßt (z.B. mit touch), sonst akzeptierst du illegale Dateinamen und hast dann später ein Problem.

Die Frage ist, wie weit man das treiben will: selbst wenn der touch jetzt erfolgreich ist, bedeutet das nicht verlässlich, dass das Anlegen oder Schreiben zu einem späteren Zeitpunkt sicher funktionieren wird.

Deavy

(Themenstarter)

Anmeldungsdatum:
11. Oktober 2012

Beiträge: 126

Wohnort: Berlin

Hi, habe ein neues Problem, aber erstmal danke schon mal ☺

ps. Das HD PVR ist ein gerät mit dem man von der PS3 über USB am Rechner aufnehmen kann. (Das war bei VLC 2.0.x noch problemlos möglich doch seit dem neuen VLC 2.1.x ist das gerät dort nicht mehr zu finden, nur noch über Video Camera als /dev/video0/ und da kann er das Video nicht wiedergeben, codec wird mir 4:2:0 YUV angezeigt sonst war es H264 Mpeg-4, das nervt mich am meisten, kompilieren der alten version kriege ich nicht hin ☹)

So, mit dem Script habe ich das Problem das sobald ich eine Aufnahme gestartet habe ich das nur mit STRG+C beenden kann, ich würde es aber gerne mit Leertaste beenden habe es mit xte und so Probiert und das ich das Script in einem Separaten Fenster öffne das hat aber nicht geklappt alles, wie mache ich das noch? 😀

ps. wenn ich das Script hier :

1
2
3
4
5
6
7
read -p "Name: " rec
while [ -e "$rec.ts" ] ; do
    echo "Datei schon vorhanden."
    read -p "neuer Name: " rec
done

cat /dev/video0 > $HOME/Videos/PVR/$rec.ts

oder ein anderes aus dem Thread nehme dann macht das Script jedes mal eine Aufnahme auch wenn die Datei schon vorhanden ist.

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7825

Ich hab den Faden verloren aber meinst du sowas:

cat dings > bums &

dingsbums=$!

read -p "Hemmem? "
kill $dingsbums

g00d.morning

Anmeldungsdatum:
20. Februar 2013

Beiträge: 330

Dein neues Problem wurde ja schon einmal von diesem abgetrennt: klick!

Zu Deinem ursprünglichen Problem:

Deavy schrieb:

So, mit dem Script habe ich das Problem das sobald ich eine Aufnahme gestartet habe ich das nur mit STRG+C beenden kann, ich würde es aber gerne mit Leertaste beenden habe es mit xte und so Probiert und das ich das Script in einem Separaten Fenster öffne das hat aber nicht geklappt alles, wie mache ich das noch? 😀

ps. wenn ich das Script hier :

1
2
3
4
5
6
7
read -p "Name: " rec
while [ -e "$rec.ts" ] ; do
    echo "Datei schon vorhanden."
    read -p "neuer Name: " rec
done

cat /dev/video0 > $HOME/Videos/PVR/$rec.ts

oder ein anderes aus dem Thread nehme dann macht das Script jedes mal eine Aufnahme auch wenn die Datei schon vorhanden ist.

Du musst natürlich das Verzeichnis überprüfen, in dem die Datei gespeichert wird!

while [ -e "$HOME/Videos/PVR/$rec.ts" ] ; do

Deavy

(Themenstarter)

Anmeldungsdatum:
11. Oktober 2012

Beiträge: 126

Wohnort: Berlin

g00d.morning schrieb:

Dein neues Problem wurde ja schon einmal von diesem abgetrennt: klick!

Ah ok, habe mich schon grfragt wo mein Post von heute Mittag hin ist 😛

Zu Deinem ursprünglichen Problem: Du musst natürlich das Verzeichnis überprüfen, in dem die Datei gespeichert wird!

while [ -e "$HOME/Videos/PVR/$rec.ts" ] ; do

Ja aber in dem Script bin ich schon mit cd in den Ordner gewechselt, ist das nicht das gleiche?

Edit: ok, so klappt es nun ☺

frostschutz schrieb:

Ich hab den Faden verloren aber meinst du sowas:

cat dings > bums &

dingsbums=$!

read -p "Hemmem? "
kill $dingsbums

Perfekt ☺

Antworten |