ubuntuusers.de

bash scripting - alle Dateien im Verzeichnis ansprechen

Status: Gelöst | Ubuntu-Version: Ubuntu
Antworten |

Kobymaru376

Anmeldungsdatum:
1. November 2006

Beiträge: 29

Hi!
Also ich bin noch ziemlich unerfahren beim Programmieren, und ich habe mich mal an das Shell scripten gewagt, und jetzt stoße ich bei so etwas simplen an meine grenzen.
Wie kann ich alle Dateien in einem Verzeichnis ansprechen? Hier ist mein script:

#/bin/sh

# all2wav.sh
# Script that converts mp3, ogg or wma files in the current directory to wav

TARGETDIR=""
FILENAME=""
EXT=""

# check where to look for music files
if [ -z "$1" ]; then
	TARGETDIR=`pwd`
else
	TARGETDIR="$1"
fi

for FILENAME in $(ls "$TARGETDIR")
do

	case "$FILENAME" in

	*.mp3) 
		echo "file "$FILENAME" was an mp3 file." ;;
	
	*.ogg) 
		echo "file "$FILENAME" was an ogg file." ;;
	 
	*.wma) 
		echo "file "$FILENAME" was a wma file." ;;
	*) ;;


	esac

done

exit 0

Ach und entschuldigt bitte diese leeren Variablenzuweisungen, ich hab nämlich mit C/C++ zu programmieren angefangen, und jetzt fühl ich mich ohne Variablendeklarationen nicht so wohl. 🙄
Ist mein erstes script, und weil ich schon an so etwas banalem wie "alles im Verzeichnis" angestoßen bin, hab ich mir gedacht ich schreib noch nicht weiter...

Also wenn die Dateinamen zusammenhängend sind, gibt es überhaupt keine Probleme. Probleme treten nämlich dann auf, wenn in meinen Dateinamen Leerzeichen vorkommen. Und das ist in so ziemlich jeder Musikdatei auf meinem PC der Fall!
Denn wenn Leerzeichen im Dateinamen vorkommen, dann wird die schleife nicht so oft durchlaufen wie es Dateien im Verzeichnis gibt, sondern so viele male wie insgesamt Wörter in den Dateinamen enthalten sind.
Ich habe versucht $(ls "$TARGETDIR") in Anführungszeichen zu setzen, allerdings mit dem Ergebnis, dass dann die schleife nur ein mal durchlaufen wurde und da enthielt $FILENAME dann die gesamte Ausgabe von ls.

Tut mir leid für so eine banale Frage, aber ich bin als anfänger ein bisschen ratlos.

Ich hab sogar ein C- Programm geschrieben, das eine beliebige Zeile einer Textdatei ausgibt, weil ich mir dachte so könnts gehn aber ich hab das Gefühl, dass das ganz und gar keine gute Lösung ist.
ein man -ls hat nicht geholfen, genauso wenig wie eine google- suche, und (ich gebs zu so genau hab ich nicht geschaut) selbst im "Advanced Bash Scripting Guide" habe ich nichts dergleichen gefunden.

Könnte mir vielleicht jemand weiterhelfen?

fana

Avatar von fana

Anmeldungsdatum:
1. August 2006

Beiträge: 463

for FILENAME in $TARGETDIR/*

Wenn du die Pfadnamen weghaben möchtest, schau dir mal man basename an.

Sehr lesenswert ist übrigens der Advanced Bash-Scripting Guide

comm_a_nder

Avatar von comm_a_nder

Anmeldungsdatum:
5. Februar 2006

Beiträge: 2533

Wohnort: Dresden

Für das Leerzeichenproblem: http://forum.ubuntuusers.de/topic/30970/. In Kurzform, vor die for Schleife muß ein

IFS="
"


Ansonsten würde ich Dir sowieso eher find für sowas empfehlen.

Kobymaru376

(Themenstarter)

Anmeldungsdatum:
1. November 2006

Beiträge: 29

Cool, danke das funktioniert jetzt. Allerdings würde mich jetzt ziemlich interessieren warum ☺ Ist IFS irgend eine shell- variable die die ausgabe verändert oder so etwas?
Nicht dass ich nicht dankbar bin, aber benutze nicht gerne befehle von denen ich die auswirkungen nicht kenne.
Ansonsten danke vielmals!

comm_a_nder

Avatar von comm_a_nder

Anmeldungsdatum:
5. Februar 2006

Beiträge: 2533

Wohnort: Dresden

man bash → /^\s*IFS eingeben
Im Wesentlichen dient $IFS dafür zu erkennen, wie Felder/Wörter voneinander getrennt werden.

Kobymaru376

(Themenstarter)

Anmeldungsdatum:
1. November 2006

Beiträge: 29

Ok, danke hab ich schon gefunden. Nur bin ich jetzt völlig von deiner Eingabe bei man verwirrt, aber das ist eine andere geschichte, das krieg ich schon hin. "man man" dient ja nicht nur zum ausdruck von Staunen... 😉

comm_a_nder

Avatar von comm_a_nder

Anmeldungsdatum:
5. Februar 2006

Beiträge: 2533

Wohnort: Dresden

Das wirste aber nicht in der Manpage zu man finden, sondern eher in der Manpage Deines eingestellten Pager 😉. Denn kann man sich btw so anzeigen lassen:

ls -l /etc/alternatives/pager
Antworten |