Wie mache ich eine Bash-Funktion, um mehrere benannte Verzeichnisse zu erstellen und dann ihre enthaltenen Dateien nach Erweiterung zu organisieren? - Linux, Bash, Rohrleitungen

Ich versuche ein bash-Funktionsskript zu erstellen, daserlaubt mir, mehrere Verzeichnisse mit den folgenden Namen zu erstellen. Jedes Mal, wenn ich es starte, mache ich beide Echos gut, aber dazwischen steht (mkdir: ./: File exists), aber die sind dort noch keine Dateien. 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.

   #!/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 versuche auch, Dateien durch Erweiterung in ihre entsprechenden Ordner zu organisieren (d. H. .Jpg in Bilder, .doc in Dokumente, .gif in Medien usw.).

   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

Antworten:

0 für die Antwort № 1

In bash wird auf Argumente für Funktionen über die Variablen $ 1, $ 2 usw. zugegriffen.

Wie in der Frage geschrieben, die Variable $folder wurde nicht festgelegt und so die mkdir ./$folder Befehl wird erweitert, um zu sein mkdir ./, welches existiert (daher die Fehlermeldung)

Die folgende kleine Optimierung würde helfen:


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

2 für die Antwort № 2

Hier ist eine effiziente, idiomatische Neuformulierung Ihres 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"

Was du versucht hast:

  • cd - Änderungen an der Bisherige Verzeichnis, was auch immer es gewesen sein mag, wie in $OLDPWD; in einem Skript, $OLDPWD es ist anfangs nicht gesetzt, verursacht die cd Befehl zum Fehlschlagen mit Fehlermeldung cd: OLDPWD not set.

    • Es ist am besten zu vermeiden, das aktuelle Verzeichnis insgesamt zu ändern oder es einmal am Anfang des Skripts zu machen oder die Änderung auf eine Untershell zu beschränken.
    • Gordon Davisson weist in einem Kommentar darauf hin, dass wenn man es benutzt cd, sollten Sie immer den Exit-Code überprüfen, um zu sehen, ob es erfolgreich war, um sicherzustellen, dass nachfolgende Befehle wirklich auf den beabsichtigten Dateien / Verzeichnissen funktionieren.
  • ./$folder Referenzvariable $folder, die Sie nie gesetzt haben; wie erwähnt, sind Argumente, die an eine Funktion übergeben werden, als $1, $2, ... oder kollektiv als Array [email protected].

    • Darüber hinaus sollten Sie in der Regel immer Doppelzitat Variablenreferenzen (es sei denn, Sie möchten, dass die Shell sie durch Leerzeichen in Wörter aufteilt und sie globben (Pfadnamenerweiterung)); in deinem Fall hätte dies bedeutet "./$folder".
  • Da beide benutzerdefinierte Funktionen und mkdir Unterstützung beim Passieren mehrere Argumente, es ist effizienter, die Funktion entsprechend zu definieren und die Namen aller zu erstellenden Ordner zu übergeben auf einmal.


Am beliebtesten