Simples Script: Von Verzeichnis das "./" am Anfang

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Anfaengerfrage
Beiträge: 2
Registriert: 11.10.2005 16:16:54

Simples Script: Von Verzeichnis das "./" am Anfang

Beitrag von Anfaengerfrage » 16.10.2005 16:07:10

Hallo,

bin absolut neu in der Scriptingwelt unter Linux (Debian) und brauche mal einen Hinweis.
Ich hab mir ein Script zusammengeschustert das alle Unterverzeichnisse eines Verzeichnisses auslist und darin vorhandene Dateien ausführt. Soweit so einfach.

Jetzt würde ich aber gerne noch den Verzeichnisnamen verwenden um damit eine andere Datei zu erstellen.
Mein Versuch bisher:

Code: Alles auswählen

#!/bin/bash
for i in $(find ./ -type d ); do
    if [ $i != "." ]; then
        echo $i;
   fi
done
Ergebnis:

Code: Alles auswählen

./verz1
./verz2
Leider kann ich das "./" überhaupt ncht gebrauchen.
Deshalb meine Frage: Wie werde ich das los!

Vielen Dank für Eure Hilfe
Anfängerfrage

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 16.10.2005 16:10:46

Willkommen im Forum.

Hast du nur ein Unterverzeichnis oder gibt es auch noch unterhalb der Unterverzeichnisse weitere Unterverzeichnisse?

wenn ersteres zutrifft, dann mach einfach:

Code: Alles auswählen

cd /ab/ins/hauptverzeichnis
for i in *
do
 echo $i
done
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Anfaengerfrage
Beiträge: 2
Registriert: 11.10.2005 16:16:54

Beitrag von Anfaengerfrage » 16.10.2005 16:54:45

Hi

Boah! Das ging ja flott! Super! Und funktioniert auch noch!

Danke

Gruß
Anfängerfrage

codi
Beiträge: 120
Registriert: 18.10.2004 20:20:22

Beitrag von codi » 17.10.2005 22:33:38

Wenn ich da gleich mal ne Anschlussfrage hinterherwerfen darf ;-)...

Ich bin gerade dabei meine alten Windows Bestände auszumisten und aufzuräumen,... Dabei möchte ich auch die Leerzeichen aus den Dateien entfernen.

Liegen die Dateien alle in einem Verzeichnis habe ich das bisher zum Beispiel so gemacht:

Code: Alles auswählen

for i in * ;do s=`echo $i | tr -s " " "-"` ; mv "$i" $s;done
Den Umweg über die Variable, damit ich mir das Ergebnis per Echo anschauen kann, ehe was verändert wird.

Problematisch wirds wenn ich die Dateien in Unterverzeichnissen per find suche,... Dann interpretiert die for Schleife jedes Leerzeichen als Feldtrenner. Wie kann man das umgehen? Habe schon die unterschiedlichen Quotes probiert, leider ohne Erfolg...

Danke und Gruß
Codi

matzi
Beiträge: 8
Registriert: 16.10.2005 22:50:01
Wohnort: Weinheim
Kontaktdaten:

Beitrag von matzi » 17.10.2005 23:39:58

Moin,

mit der Variablen IFS kannst du den/die Feldtrenner setzen. Es gibt aber noch ein anderes Problem und zwar wenn Verzeichnisse Leerzeichen enthalten. Deshalt behandeln wir diese zu erst.

Code: Alles auswählen

#!/bin/sh

old_IFS=${IFS}
IFS=$'\n'
for f in $(find . -type d); do
    n=$(echo "${f}" | sed -e "s| |-|g")
    if [ "${f}" != "${n}" ]; then
        echo "\"${f}\" ==> \"${n}\""
        mv "${f}" "${n}"
    fi
done
for f in $(find . -type f); do
    n=$(echo "${f}" | sed -e "s| |-|g")
    if [ "${f}" != "${n}" ]; then
        echo "\"${f}\" ==> \"${n}\""
        mv "${f}" "${n}"
    fi
done
IFS=${old_IFS}

Viel Spaß
matzi

codi
Beiträge: 120
Registriert: 18.10.2004 20:20:22

Beitrag von codi » 18.10.2005 15:41:19

Ja prima, vielen Dank! Dann kann man den Fieldseperator der Bash ändern,... irgendwie naheliegend, auf einem System wo man doch eigentlich alles ändern kann ;-)... damit hat mein Einzeiler auch geklappt...

Code: Alles auswählen

 for i in `find ./music/ -type f -iname "*.mp3"`;do s=$(echo $i | tr -s " " "-" | tr "A-Z" "a-z"); if [ "$i" != "$s" ];then mv "$i" $s ; echo $s  ok;fi;done
Da fällt mir gleich noch eine Frage ein: Du schließt alle Variablen in Klammern ein $(f), warum machst Du das?

Gruß
Codi

matzi
Beiträge: 8
Registriert: 16.10.2005 22:50:01
Wohnort: Weinheim
Kontaktdaten:

Beitrag von matzi » 18.10.2005 16:17:27

codi hat geschrieben: Da fällt mir gleich noch eine Frage ein: Du schließt alle Variablen in Klammern ein $(f), warum machst Du das?

Gruß
Codi
Nehmen wir an du willst die Dateien A B und C in A_alt B_alt und C_alt umbenennen.

Code: Alles auswählen

for datei in A B C; do
    mv "$datei" "$datei_alt"
done

==>
mv "A" ""
mv "B" ""
mv "C" ""
$datei_alt ist aber ein gültiger Variablenname. Das heist $datei_alt ist im obigen Bsp. leer.

Code: Alles auswählen

for datei in A B C; do
    mv "$datei" "${datei}_alt"
done

==>
mv "A" "A_alt"
mv "B" "B_alt"
mv "C" "C_alt"
Hier wird an die Variable ${datei} der suffix _alt angehängt.

Code: Alles auswählen

for datei in A B C; do
    mv "$datei" "$datei.alt"
done

==>
mv "A" "A.alt"
mv "B" "B.alt"
mv "C" "C.alt"
Das würde funktionieren, da der Punkt in Variablennamen nicht erlaubt ist.

Gruß
matzi

Antworten