ubuntuusers.de

[Bash-Skript] Dateinamen in Skript verarbeiten

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

onkel25

Avatar von onkel25

Anmeldungsdatum:
18. Mai 2005

Beiträge: 83

Hallo,

ich steh grad ganz gewaltig auf dem Schlauch. Ich suche einen Tip, wie ich das folgende Szenario bewältigen kann:

Ich habe ein Verzeichnis mit ca. tausend Dateien. Die Dateien heißen bsp. ACDC-Higway.ogg ACDC-Thunderstruck.ogg ... Metallica-Nothing.ogg etc.
Nun möchte ich ein Skript basteln, dass mir die Dateien in Ordner sortiert. Es soll also aus den Dateinamen das erste Wort bis zum Bindestrich ausgelesen werden, ein Ordner mit Namen "ACDC" angelegt werden und alle Dateien, die bis zum Bindestrich auch ein ACDC haben, sollen da hinein verschoben werden.

Kann mir da jemand einen kleinen Denkanstoß geben, wie ich den Dateinamen-Teil in einem Bash-Skript auslesen und verarbeiten kann?

Den Dateinamen selbst kann ich schon auslesen:

#!/bin/bash

for i in *; do
	echo $i
	sleep 1
done


aber wie bekomme ich alles nach dem Bindestrich weg?

Wäre für jeden Tip dankbar!

Gruß, Mario

comm_a_nder

Avatar von comm_a_nder

Anmeldungsdatum:
5. Februar 2006

Beiträge: Zähle...

Wohnort: Dresden

Ich hatte hier schon mal was in der Art für jemanden gemacht.
Interessant sind vor allem folgende beiden Zeilen:

FOLDER=$(expr match $FILE '\(.*\)'$SEPARATOR)
TITLE=$(expr match $FILE '.*'$SEPARATOR'\(.*\)')

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17604

Wohnort: Berlin

oder mit sed:

prefix=$(echo $file | sed 's/\([^-]*\)-.*/\1/g')


$i statt $file bei Dir.

comm_a_nder

Avatar von comm_a_nder

Anmeldungsdatum:
5. Februar 2006

Beiträge: Zähle...

Wohnort: Dresden

Warum sed bemühen wenn es die Bash von ganz alleine schafft. Zugegeben bei 1000 Files macht es noch keinen Unterschied, aber bei ner Million kann es sich schon auswirken, wenn zu jedem File ein neuer Prozess gestartet werden muß.

onkel25

(Themenstarter)
Avatar von onkel25

Anmeldungsdatum:
18. Mai 2005

Beiträge: 83

Danke für eure Tips! Jetzt funktioniert zumindest schon mal der Teil...

Gruß, Mario

comm_a_nder

Avatar von comm_a_nder

Anmeldungsdatum:
5. Februar 2006

Beiträge: Zähle...

Wohnort: Dresden

Zur Untermauerung meiner Aussage von vorhin:

11:40:41 commander@mel:/home/commander
[!7618]$cat /home/commander/bin/bash_vs_sed
#!/bin/bash

DIR="/usr/src/linux-source-2.6.15"

echo "Anzahl Files: $(find $DIR -type f | wc -l)"

IFS="
"
case "$1" in
        "sed" )
                for filename in $(find $DIR -type f)
                do
                        ext=$(echo $filename | sed 's#^.*\.\([^\.]*\)$#\1#')
                done
                ;;
        "bash" )
                for filename in $(find $DIR -type f)
                do
                        ext=$(expr match $filename '.*\.\([^\.]*\)')
                done
                ;;
esac


11:40:54 commander@mel:/home/commander
[!7619]$time bash_vs_sed sed
Anzahl Files: 19954

real    1m48.203s
user    0m46.227s
sys     0m57.344s
11:42:47 commander@mel:/home/commander
[!7620]$time bash_vs_sed bash
Anzahl Files: 19954

real    1m15.112s
user    0m40.470s
sys     0m31.318s
11:44:11 commander@mel:/home/commander
[!7621]$

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17604

Wohnort: Berlin

Zur Widerlegung Deiner Aussage von vorhin:
comm@nder hat geschrieben:

Warum sed bemühen wenn es die Bash von ganz alleine schafft.

a) Schafft es bash nicht alleine - zumindest nicht die von Dir vorgestellte Lösung:

 > which expr
/usr/bin/expr


b) benutzt Dein benchmark ein anderes Muster.
Ich glaube zwar nicht, daß sed bei dem gestellten Problem schneller ist, als bei dem benchmark, aber da die Geschwindigkeit von sed sehr abhängig vom Pattern und den Eingabedaten ist, ist der Benchmark unseriös.
c) Da die Dateien umbenannt werden sollen (bzw., wenn der Zielordner auf einer anderen Partition ist, bewegt werden müssen) kann der Geschwindigkeitsvorteil von etwa 30% leicht in den mikroskopischen Bereich, wenn die Dateioperation um Größenordnungen länger dauert, als die sed/ expr-Operation, rutschen.

Ernsthaft betrachtet bietet sich sed nur für diejenigen an, die mit sed geübt, und mit expr ungeübt sind.

Antworten |