Dateien umbennen und verschieben

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von MrBoe, 04.07.2007.

  1. MrBoe

    MrBoe Routinier

    Dabei seit:
    13.06.2006
    Beiträge:
    399
    Zustimmungen:
    0
    Ort:
    braunschweig/nds/de/world
    Hallo!

    Ich beginne grade mich etwas in shell Programmierung einzuarbeiten. Ich habe mir ein Skript größtenteils geklaut und ein bisschen daran herumprobiert. Unter anderem habe ich einen Counter eingebaut, der seinen initialen Wert aus einer Datei liest.

    Mag man über das Skript denken was man will.
    Ich habe ein Problem.
    Es funktioniert soweit ganz gut. Allerdings kann es nicht mit Dateinamen umgehen, die Leerzeichen enthalten. Wie kann ich das ändern?

    Code:
    #! /bin/bash
    #
    #  NAME: number_files_01.sh
    #
    #  SHELLS: bash
    #
    #  PURPOSE: utility that numbers the files in a directory consecutively
    #
    #  USAGE: number_files_01 <directory>
    #+ As in "number_files_01 ~/Bilder/Urlaub_2006/", which numbers all picture files in the specified directory
    
    
    if [ -z "$1" ]                  # check whether a command line argument was specified by the user
    
    then
    
        echo "Usage: `basename $0` <directory>"     # error message
    
        exit 65                             # stop execution of the script
    
    elif [ ! -d $1 ]                # check whether the argument specified by the user is really a directory
    
    then
    
        echo "$1 is not a directory!"               # error message
    
        exit 1                      # stop execution of the script
    
    fi                              # end of first IF-clause
    
    COUNTER=$(cat nummer)           # establish a counter for the new filenames
    
    cd $1                           # change the current directory to the one specified by the user
    
    for FILENAME in *.jpg         # traverse all pictures in the directory specified
    
    do                              # begin loop
    
        if [ -f "$FILENAME" ]       # check whether there is a file to rename
    
        then
    
            let "COUNTER += 1"                      # increase the counter
            new_name=`printf %06d.jpg $COUNTER`     # generate the new filename: consisting of 4 digits
    
            if [ ! -d ./tmp ]                       # check whether a subdirectory already exists
    
            then
    
                mkdir tmp 2> /dev/null              # try to create a temporary directory in $1
                if [ $? -ne 0 ]                     # check whether the subdirectory was generated
    
                then
    
                    echo 'The necessary subdirectory could not be created!'  1>&2     # error message
    
                    exit                            # stop execution of the script
    
                fi                                  # end of fourth IF-clause
    
            fi                                      # end of third IF-clause
    
            cp -i $FILENAME ./tmp/$new_name         # the combination of "cp" and "rm" seems more safe than the plain "mv"
    
            if [ $? -eq 0 ]                         # check whether the file was copied
    
            then
    
                rm $FILENAME                        # delete the original file
    
            fi                                      # end of fifth IF-clause
            echo $COUNTER > nummer
    
        fi                                          # end of second IF-clause
    
    done                            # end of the loop
    
    mv ./tmp/*.jpg $1            # move the renamed files to the directory specified by the user
    
    if [ $? -eq 0 ]                 # check whether the files could be moved
    
    then
    
        rm -r ./tmp                 # delete the temporary directory
    
    else
    
        echo "The renamed files are still in the directory ./tmp ..."
    
    fi                              # end of sixth IF-clause
    
    exit 0                          # end of the script
    
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Schneemann, 04.07.2007
    Schneemann

    Schneemann Routinier

    Dabei seit:
    27.06.2006
    Beiträge:
    289
    Zustimmungen:
    0
    Ort:
    /home/janosch
    Hi,

    Du musst die Leerzeichen entweder "escapen" (" "="\ ") oder den Namen in Anführungszeichen schreiben.
     
  4. MrBoe

    MrBoe Routinier

    Dabei seit:
    13.06.2006
    Beiträge:
    399
    Zustimmungen:
    0
    Ort:
    braunschweig/nds/de/world
    Also in der for Schleife sowas?
     
  5. dizzgo

    dizzgo Lernbereite Riesenratte

    Dabei seit:
    04.08.2005
    Beiträge:
    573
    Zustimmungen:
    0
    Ort:
    /ch/sg///
    ... oder du machst es mit 'read'.
    Gruss
    d22
     
  6. MrBoe

    MrBoe Routinier

    Dabei seit:
    13.06.2006
    Beiträge:
    399
    Zustimmungen:
    0
    Ort:
    braunschweig/nds/de/world
    Also das mit dem for FILENAME in "*.jpg" klappt nicht.
    Da scheint er die for Schleife direkt zu beenden.

    Wie mache ich das mit read? Muss ich da erste ein Liste mit "ls -l" erstellen, aus der dann gelesen wird?
     
  7. #6 Wolfgang, 04.07.2007
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Alle Variablen die Dateinamen enthalte konsequent an allen Stellen Quotings ("") rein.
    Bei verschiedenen Befehlen klappt es nicht, da die Shell die Argumente am IFS (default Leerzeichen und Tab) zerstückelt.

    Ein mögliches Konstruckt um Leerzeichen und anderen (Sondermüll) in Dateinamen zu verdauen ist find mit xargs.
    Ja, die Leerzeichen sind sehr schnell uncool, wenn die mal in einem Skript verarbeitet werden müssen. ;)

    Geht es nur um Leerzeichen, dann hilft auch schon read:
    Code:
    find -type f -iname "*jpg" |while read filename;
    do
    echo "$filename"
    ...
    done
    
    ls -l ist keine gute Idee, da du ja das Longformat dann erst wieder parsen musst.


    Gruß Wolfgang
     
  8. dizzgo

    dizzgo Lernbereite Riesenratte

    Dabei seit:
    04.08.2005
    Beiträge:
    573
    Zustimmungen:
    0
    Ort:
    /ch/sg///
    Mit 'ls -1' wärs auch ne möglichkeit:
    Code:
    ls -1 | while read filename
    do 
      echo $filename
      ...
    done
    
    Gruss
    d22
     
  9. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  10. MrBoe

    MrBoe Routinier

    Dabei seit:
    13.06.2006
    Beiträge:
    399
    Zustimmungen:
    0
    Ort:
    braunschweig/nds/de/world
    Hoho, vielen Dank!

    Bash ist ja schon ne ganz coole Geschichte, was?
     
  11. dizzgo

    dizzgo Lernbereite Riesenratte

    Dabei seit:
    04.08.2005
    Beiträge:
    573
    Zustimmungen:
    0
    Ort:
    /ch/sg///
    Kannst du wohl laut sagen ;)
     
Thema:

Dateien umbennen und verschieben

Die Seite wird geladen...

Dateien umbennen und verschieben - Ähnliche Themen

  1. Alle Dateien eines Ordners umbennenen

    Alle Dateien eines Ordners umbennenen: Hallo Forum, ich benutze einen Mac, allerdings möchte ich mir ein Shellskript basteln und habe allerdings keine Ahnung wie! Bin absolute neu in...
  2. Mehrere Dateien Umbennen | Zeichenkette aus Dateinamen entfernen

    Mehrere Dateien Umbennen | Zeichenkette aus Dateinamen entfernen: Hi Leute, ich brauch mal wieder die hilfe mit einem kleinen Shell-Skript. Ich hab eine kleine Sammlung an Fun-Bildern. Die hab ich bisher...
  3. Alle Dateien eines Verzeichnisses mit einer anderen Datei vergleichen

    Alle Dateien eines Verzeichnisses mit einer anderen Datei vergleichen: Hallo, ich habe ein Verzeichnis, darin enthalten sind mehrere Dateien. Nun möchte ich alle Dateien (Parameter $1) gegen eine konstante Datei...
  4. Dateien selektieren und zählen

    Dateien selektieren und zählen: Hallo, das ist mein erster Beitrag, bitte entschuldigt, falls nicht alles richtig geschrieben ist. Ich muss meine erste Hausaufgabe als...
  5. Benötige Hilfe- Dateien vergleichen

    Benötige Hilfe- Dateien vergleichen: Hallo, für eine Arbeit an der Uni muss ich einige viele Bilder miteinander vergleichen, was ich gerne durch eine Automatisierung etwas...