ubuntuusers.de

Function - Prüfen ob Datei vorhanden oder nicht

Status: Gelöst | Ubuntu-Version: Server 16.04 (Xenial Xerus)
Antworten |

Nur-Ein-Blogger

Anmeldungsdatum:
4. April 2011

Beiträge: 146

Hallo, ich habe ein größeres Script, darin werden Dateien erstellt und gelöscht. So verhält es sich auch mit Ordnern.

Nun möchte ich aber nicht vor jeder Datei

1
2
3
if [ ! -f /tmp/foo.txt ]; then
    echo "File not found!"
fi

prüfen ob die da ist oder nicht. Zumindest nicht so.

Ich würde dazu gern eine funktion nutzen.

also

1
2
3
4
5
checkfile() {
if [ ! -f /tmp/foo.txt ]; then
    echo "File not found!"
fi
}

Aber ich weiß nicht, wie ich die Funktion baue, dass das am ende funktioniert:

1
2
3
mkdir /etc/dovecot/conf.d
mkdir -p /var/vmail/sieve
mkdir -p /var/vmail/public

So ginge es ja auch:

1
2

if test -f "/etc/passwd"; then echo "The File Exists";fi

Aber das müsste ja dann quasi wieder bei jedem Befehl dastehen.

Dazu braucht die funktion ja einen return Wert und eine Eingabe. Kann mir da jemand einen kleinen stoß in die richtige Richtung geben?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11261

Wohnort: München

1
2
3
4
function check_file {
    [ -f "$1" ]
    return $?
}

Nutzen kann man das dann z.B. so:

1
2
3
4
5
6
7
check_file /pfad/zur/datei && echo "File exists" || echo "File not found!"
# oder auch
if check_file /pfad/zur/datei; then
    echo "File exists"
else
    echo "File not found!"
fi

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

Mir ist noch unklar, was Du verallgemeinern willst.

  • Dateien und Ordner?

  • Erstellen und Löschen?

  • Meldungen und Aktionen?

Für Dateien und Ordner gibt es ja unterschiedliche Befehle um sie zu erzeugen/zu löschen:

1
2
3
4
5
6
mkdir foo
rmdir foo
touch bar
rm bar
echo "Fehler, foo existiert"
echo "Fehler, foo existiert nicht"

Das ist allerdings schon so kurz, dass da kaum was wegzuoptimieren ist:

1
2
3
4
test   -f $file && rm    $file || echo "Datei $file existiert nicht"
test   -f $dir  && rmdir $dir  || echo "Verzeichnis $dir existiert nicht"
test ! -f $file && touch $file || echo "Datei $file existiert schon"
test ! -f $dir  && mkdir $dir  || echo "Verzeichnis $dir existiert schon"

Du könntest natürlich 4 Funktionen schreiben, i(mk|del)(dir|file) so dass Du imkdir foo oder idelfile bar aufrufen kannst (i wie if) usw.

Du könntest auch 2 boolsche Parameter übergeben um Dir/File und Löschen/Anlegen zu unterscheiden, und alles in einer Funktion abhandeln, die Du dann mit machNichtLoeschDirNichtFile 1 0 foobar aufrufen könntest (bzw. mit 1 1, 0 1, 0 0) aber so recht lesbar ist es nicht.

Falls die Frage auf etwas anderes abzielt müsstest Du das nochmal erklären.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

Die Universalfunktion könnte man verbessern, in dem man keinen boolschen, verwirrenden Operator übergibt, sondern Text:

1
2
bedingt Datei loeschen foo 
bedingt Dir machen foo 

Das wäre ergonomischer und man würde auf Text matchen, um die Fallunterscheidung zu machen. Im Kopf behalten muss man dann nur, ob die Datei/Verzeichnisunterscheidung vor oder hinter der Unterscheidung anlegen oder löschen kommt.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
bedingt () {
typ=$1
aktion=$2 
datei=$3

case $typ.$aktion in 
	Datei.loeschen )
		test   -f $datei && rm    $datei || echo Datei $datei existiert nicht
		;;
	Dir.loeschen )	
		test   -d $datei && rmdir $datei || echo Verzeichnis $datei existiert nicht
		;;
	Datei.machen )
		test ! -e $datei && touch $datei || echo Datei $datei existiert schon 
		;;
	Dir.machen )
		test ! -e $datei && mkdir $datei || echo Datei $datei existiert schon
		;;
	.* )
		echo unbekannte Parameter $typ $aktion $datei
esac
}

bedingt Datei loeschen foob
bedingt Dir loeschen foob
bedingt Dir machen fooba
bedingt Datei machen fooba

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13208

user_unknown schrieb:

Mir ist noch unklar, was Du verallgemeinern willst.

  • Dateien und Ordner?

  • Erstellen und Löschen?

  • Meldungen und Aktionen?

Geht mir auch so: was genau willst Du abstrahieren, Nur-Ein-Blogger?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13208

Ein Vorschlag:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
da() {
  local f="$1"
  shift || return

  if [ -r "$f" ]; then
    "$@" "$f"
  else
    echo "Fehlt: $f" >&2
    return 1
  fi
}

...

da /tmp/foo.txt wc -c

Nicht sehr schön, wie ich finde, aber bei anderen Lösungen muss man den Dateinamen zwei Mal angeben - ein Mal für die Testfunktion und ein Mal für die Ausführung des abhängigen Kommandos.

Nur-Ein-Blogger

(Themenstarter)

Anmeldungsdatum:
4. April 2011

Beiträge: 146

Danke für eure Antworten.

Ich wollte eine Möglichkeit, wie ich mit minimalen Aufwand

1
mkdir /etc/lala/

machen kann und er dabei nur

1
mkdir /etc/lala

macht, wenn der Ordner nicht existiert.

Quasi, wenn es gehen würde so etwas:

1
! mkdir /etc/lala/

Sollte der Ordner also nicht schon existieren, dann erstelle ihn, wenn er da ist wird der Befehl ignoriert.

Oder eben so:

1
mkdirfunk(/etc/lala/)

Ist eher so ein Gedanke dazu gewesen, weil ich in den error outputs halt gesehen habe, dass teilweise einige Ordner und Dateien schon existieren. Ich aber nicht jedes mkdir oder rm, touch etc. so

1
2
3
if [ ! -d /etc/lala/ ]; then
  # Control will enter here if $DIRECTORY doesn't exist.
fi

ersetzen wollte.

Daher ist mir der Gedanke gekommen ob und wie es möglich WÄRE eine Funktion zu schreiben, die das eben übernimmt und der Aufruf am Ende auch minimalistisch bleibt

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Nur-Ein-Blogger schrieb:

Ich wollte eine Möglichkeit, wie ich mit minimalen Aufwand

1
mkdir /etc/lala/

machen kann und er dabei nur

1
mkdir /etc/lala

macht, wenn der Ordner nicht existiert.

Ach so, wenn's weiter nicht ist ...!

Dann schau mal in man mkdir -   (wie eigentlich immer in solchen Fällen)
dafür gibt's nämlich extra die Option -p , also:

mkdir -p /etc/lala/

Das war's.

LG,

track

Nur-Ein-Blogger

(Themenstarter)

Anmeldungsdatum:
4. April 2011

Beiträge: 146

1
mkdir -p

ach man, ja stimmt.

Danke .....

Antworten |