2016-04-13 10 views
1

Ich versuche, eine Bash-Skript-Funktion zu erstellen, die mich unter mehreren Verzeichnisse mit den Namen erstellen können. Jedes Mal, wenn ich es laufen i hat Echos sowohl in Ordnung, aber in zwischen ihm sagt (mkdir: ./: Datei vorhanden ist), aber das sind keine Dateien schon da. Was mache ich falsch? Ich sollte hinzufügen, dass das Skript ein anderer Ordner in meinem Root-Verzeichnis namens bin ist, nur um klar zu sein.Wie mache ich eine Bash-Funktion mehr benannte Verzeichnisse zu erstellen und dann ihre enthaltenen Dateien nach Erweiterung organisieren?

#!/bin/bash 

    echo "Creating directory categories" 

    function make_folder 
    { 
     cd -; cd content; sudo mkdir ./$1 
    } 

    make_folder "documents" 
    make_folder "other" 
    make_folder "pictures" 
    make_folder "media" 

    echo "Directories have been made"; cd - 
    exit 

Update: Ich bin auch Dateien versuchen, in die entsprechenden Ordner durch die Erweiterung zu organisieren (d .jpg in Bilder, .doc in Dokumente, GIF- in Medien, etc).

ext="${filename##*.}" #set var ext to extension of files 

    find ./random -name | #find and list all files in random folder 
         #pipe results of find into if statement 

    if ext == ["jpg"; "jpeg"; "png"] #move ".jpg", etc to new destination 
     then 
      mv /path/to/source /path/to/destination 

    elif ext == [".gif"; ".mov"] #move ".gif", etc to new destination 
     then 
      mv /path/to/source /path/to/destination 
    else       #move other files into to new destination 
      mv /path/to/source /path/to/destination 
    fi 
+0

Sie haben keine $ Ordnervariable, ersetzen durch $ 1. – karakfa

+0

Vielen Dank, ich bin neu im Bash, also dachte ich, es war etwas Einfaches – lettda

+0

Wenn eine Antwort Ihr Problem löst, akzeptieren Sie es, indem Sie auf das große Häkchen (✓) daneben klicken und es optional auch abstimmen (Up-Voting erfordert mindestens 15 Reputationspunkte). Wenn Sie andere Antworten hilfreich fanden, stimmen Sie sie bitte ab. Akzeptieren und Up-Voting hilft zukünftigen Lesern. Bitte lesen Sie [den entsprechenden Artikel in der Hilfe] (http://stackoverflow.com/help/someone-answers). Wenn Ihre Frage noch nicht vollständig beantwortet wurde, geben Sie bitte Feedback. – mklement0

Antwort

0

In bash werden Argumente an Funktionen über Variablen zugegriffen mkdir ./ $ 1, $ 2 usw.

Wie in der Frage geschrieben hat die Variable $folder nicht gesetzt worden ist und so der mkdir ./$folder Befehl erweitern sein , die vorhanden ist (daher die Fehlermeldung)

folgende leichte zwicken würde helfen:


function make_folder 
    { 
     folder=$1 
     cd -; cd content; sudo mkdir ./$folder 
    } 
+0

Ich vermute, du meintest 'local folder = $ 1', nicht' $ folder = $ 1', da letzteres ein Syntaxfehler ist. –

+0

Danke @MikeHolt –

2

Hier ist eine effiziente, idiomatische Neuformulierung des Codes:

#!/bin/bash 

# Note how I'm using *single* quotes for all strings that should be 
# treated as *literals* (strings that need no interpolation). 
echo 'Creating directory categories' 

make_folders() 
{ 
    # Create subfolders, prefixed with `./content/` 
    # "${@}" is the array of all arguments (parameters) and parameter 
    # expansion `/#/./content/` replaces (`/`) the beginning of each parameter 
    # (`#`) with string './content/', which effectively prepends './content/` to 
    # each argument. 
    sudo mkdir -p "${@/#/./content/}" 
} 

# Change to the root folder here; e.g.: 
# Without an argument, `cd` changes to the current user's home folder. 
# (This won't usually fail, but it's always a good idea to check.) 
cd || { echo 'Error.' >&2; exit 1; } 
# Alternatively, do nothing to start with the *current* dir, 
# or use `cd -- "${BASH_SOURCE%/*}"` to change to the folder in which 
# the script resides. 

make_folders 'documents' 'other' 'pictures' 'media' || { echo 'Error.' >&2; exit 1; } 

echo 'Directories have been made' 

Als für das, was Sie versucht haben:

  • cd - Änderungen an der vorherigen Verzeichnis, was immer es gewesen sein mag, als gespeicherte in $OLDPWD; in einem Skript, $OLDPWD es zunächst ungesetzt, wodurch der cd Befehl mit der Fehlermeldung fehlschlagen cd: OLDPWD not set.

    • Es ist am besten zu vermeiden, das aktuelle Verzeichnis zu ändern. ganz oder es einmal zu Beginn des Skripts oder Umfang die Änderung zu einer Subshell zu tun.
    • Gordon Davisson zeigt in einem Kommentar, dass, wenn Sie cd verwenden, sollten Sie immer überprüfen, seinen Exit-Code zu sehen, ob es erfolgreich war, um sicherzustellen, dass nachfolgende Befehle wirklich auf die vorgesehenen Dateien/Verzeichnisse arbeiten.
  • ./$folder Referenzen Variable $folder, die Sie nie eingestellt haben; wie bereits erwähnt, auf eine Funktion übergebenen Argumente sind zugänglich, wie $1, $2, ..., oder gemeinsam als Array[email protected].

    • Zusätzlich als allgemeine Regel sollten Sie immer doppelte Anführungszeichen Variablenreferenzen (es sei denn, Sie wollen speziell die Shell sie in Worte durch Leerzeichen zu trennen und unterziehen sie Globbing (Pfadnamenerweiterung)); in Ihrem Fall hätte dies "./$folder" bedeutet.
  • Da beide benutzerdefinierte Funktionen und mkdir Unterstützung mehrere Argumente zu übergeben, ist es effizienter, die Funktion entsprechend zu definieren und die Namen aller Ordner übergeben sofort zu erstellen.

+1

Ein weiterer Hinweis zur Verwendung von 'cd' in Skripten: Wenn Sie es verwenden, sollten Sie * immer * seinen Exit-Status überprüfen, denn wenn ein' cd' fehlschlägt, werden nachfolgende Befehle aus einem anderen Verzeichnis ausgeführt als die, die du erwartet hast. Dies und relative Dateiverweise können verwirrend werden. –

+0

@GordonDavisson: Toller Tipp, danke - Ich habe die Antwort aktualisiert. – mklement0