[gelöst] debian bash script if file-type exist

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
joe2017
Beiträge: 1223
Registriert: 07.08.2017 14:29:51

[gelöst] debian bash script if file-type exist

Beitrag von joe2017 » 20.06.2024 09:45:08

Guten Morgen zusammen,

ich versuche gerade mittels script zu prüfen ob folgender file-type in einem Verzeichnis existiert.
Dateien und Ordner kann ich ganz einfach prüfen. Bei der Prüfung eines file-types erhalte ich die Meldung

Code: Alles auswählen

bash: [: Zu viele Argumente.
ANbei meine Prüfung:

Code: Alles auswählen

if [ -e /path/*.sh ]; then
echo "yes"
fi
Wenn ich eine einzelne Datei angebe funktioniert alles? Was mache ich hierbei falsch. Eigentlich sollte das so funktionieren?
Zuletzt geändert von joe2017 am 20.06.2024 14:51:45, insgesamt 1-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 8939
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: debian bash script if file-type exist

Beitrag von Meillo » 20.06.2024 09:48:08

`-e' kann nur genau ein Argument pruefen. Wenn also `*.sh' auf mehrere Dateinamen expandiert, dann geht das nicht mehr. Dafuer brauchst du eine Schleife.
Use ed once in a while!

Benutzeravatar
joe2017
Beiträge: 1223
Registriert: 07.08.2017 14:29:51

Re: debian bash script if file-type exist

Beitrag von joe2017 » 20.06.2024 09:53:03

Und einen File Type suchen direkt geht nicht?
Mir ist prinzipiell erst einmal egal wie die Dateien heißen. Ich muss nur prüfen ob ein bestimmter Datei Typ vorhanden ist.
Anschließend möchte ich alle Dateien mit cp kopieren. Jedoch nur wenn diese existieren. Sonst erhalte ich im script immer Fehlermeldungen (Datei existiert nicht).

Benutzeravatar
Meillo
Moderator
Beiträge: 8939
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: debian bash script if file-type exist

Beitrag von Meillo » 20.06.2024 10:29:50

Ich verstehe nicht, was du mit ``file-type'' meinst. Dateiendungen?

Du koenntest es so machen:

Code: Alles auswählen

if find . -type f -name '*.sh' >/dev/null 2>&1 ; then
	echo "es hat shell dateien"
fi
Use ed once in a while!

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

Re: debian bash script if file-type exist

Beitrag von tobo » 20.06.2024 10:32:41

Du könntest alternativ sowas machen:

Code: Alles auswählen

if [ -e `echo "path/*.sh" | cut -d" " -f1` ]; then echo "yes"; fi

Benutzeravatar
Meillo
Moderator
Beiträge: 8939
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: debian bash script if file-type exist

Beitrag von Meillo » 20.06.2024 13:02:03

Mir faellt gerade ein, dass es noch einfacher geht:

Code: Alles auswählen

if ls *.sh >/dev/null 2>&1 ; then
	echo "es hat shell dateien"
fi
Zuletzt geändert von Meillo am 20.06.2024 13:34:15, insgesamt 1-mal geändert.
Grund: Einschraenkung entfernt
Use ed once in a while!

Benutzeravatar
Tintom
Moderator
Beiträge: 3050
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: debian bash script if file-type exist

Beitrag von Tintom » 20.06.2024 13:23:33

Ohne if: find . -type f -name '*.sh' -exec echo found script {} \;

wanne
Moderator
Beiträge: 7517
Registriert: 24.05.2010 12:39:42

Re: debian bash script if file-type exist

Beitrag von wanne » 20.06.2024 13:30:12

Meillo hat geschrieben: ↑ zum Beitrag ↑
20.06.2024 13:02:03
(Das funktioniert solange man keine Datei hat, die ``*.sh'' (also mit dem Stern im Namen) heisst.)
Warum?
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
Meillo
Moderator
Beiträge: 8939
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: debian bash script if file-type exist

Beitrag von Meillo » 20.06.2024 13:33:22

wanne hat geschrieben: ↑ zum Beitrag ↑
20.06.2024 13:30:12
Meillo hat geschrieben: ↑ zum Beitrag ↑
20.06.2024 13:02:03
(Das funktioniert solange man keine Datei hat, die ``*.sh'' (also mit dem Stern im Namen) heisst.)
Warum?
Ach so, stimmt, `*.sh' ist ja auch eine Shellscript-Datei. :facepalm: Dann mache ich meine Einschraenkung schnell wieder weg.
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 8939
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: debian bash script if file-type exist

Beitrag von Meillo » 20.06.2024 13:42:08

Meillo hat geschrieben: ↑ zum Beitrag ↑
20.06.2024 13:02:03
Mir faellt gerade ein, dass es noch einfacher geht:

Code: Alles auswählen

if ls *.sh >/dev/null 2>&1 ; then
	echo "es hat shell dateien"
fi
Zur Erklaerung wie der Befehl funktioniert:

Die Shell expandiert `*.sh' zunaechst zu allen Dateinamen, die auf das Pattern matchen. D.h. das Pattern wird durch eine Liste dieser Namen ersetzt. Anschliessend listet `ls' diese auf, wobei alle Ausgabe verworfen wird und das `if' nur schaut, ob der `ls'-Befehl erfolgreich war. Wenn es diese Dateien gibt, dann ist `ls' erfolgreich.

Wenn es nun keine Shellscriptdateien hat, dann kann die Shell `*.sh' nicht expandieren und laesst es unveraendert stehen. `ls' versucht daraufhin eine Dateie, die genau ``*.sh'' heisst, aufzulisten, was fehlschlaegt, weil es keine Datei diesen Namens gibt.

Falls es nun in dem Verzeichnis genau eine Datei mit dem Namen ``*.sh'' gibt, dann trifft hier der erste Fall zu, d.h. das Glob-Pattern `*.sh' wird durch den Dateinamens-String `*.sh' ersetzt und `ls' kann diese Datei erfolgreich auflisten. (Diesen Fall hatte ich anfangs nicht genau durchdacht, Er funktioniert aber ganz normal wie andere Shellscript-Dateien auch.)
Use ed once in a while!

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

Re: debian bash script if file-type exist

Beitrag von tobo » 20.06.2024 13:53:16

Meillo hat geschrieben: ↑ zum Beitrag ↑
20.06.2024 13:02:03
Mir faellt gerade ein, dass es noch einfacher geht:

Code: Alles auswählen

if ls *.sh >/dev/null 2>&1 ; then
	echo "es hat shell dateien"
fi
in kurz:

Code: Alles auswählen

ls *.sh >&/dev/null && echo yes

Benutzeravatar
joe2017
Beiträge: 1223
Registriert: 07.08.2017 14:29:51

Re: debian bash script if file-type exist

Beitrag von joe2017 » 20.06.2024 14:51:33

Danke! Das hat bestens funktioniert:

Code: Alles auswählen

ls *.sh >&/dev/null && echo yes

Antworten