
Ich kann Dateien im Terminal ganz einfach verschieben. Ich habe jeden Tag eine Menge Material, das von Studenten eingereicht wird, und es würde mir das Leben sehr erleichtern, wenn ich abends eine Funktion hätte, mit der ich alle eingereichten Fotos (normalerweise JPGs und PNGs) in ein Verzeichnis und alle Textdateien in ein anderes verschieben kann.
Ich könnte etwas Einfaches mit mv *.jpg
Befehlen schreiben, aber wenn keine dieser Dateitypen vorhanden sind, gehe ich davon aus, dass das gesamte Skript fehlschlagen würde und die ganze zeitsparende Übung sinnlos wäre.
Um es noch komplizierter zu machen: Einige meiner älteren Schüler reichen ihre Unterlagen im ZIP-Format ein, deshalb möchte ich, dass das Skript sie zuerst extrahiert.
Also, TL;DR – Zip-Dateien extrahieren und Dateien verschieben, ohne durch Fehler angehalten zu werden, die dadurch verursacht werden, dass ein bestimmter Dateityp nicht vorhanden ist.
Antwort1
Ich gehe davon aus, dass das gesamte Skript fehlschlagen würde
Das wird nicht passieren, nur dieser einzelne Befehl würde „fehlschlagen“ (was bedeutet, dass das *.jpg
Globbing-Muster zu einem Literal erweitert wird *.jpg
, wodurch der Befehl einen Fehler ausgibt, falls eine Datei mit dem Namen *.jpg
nicht existiert), aber das Skript wird trotz des Fehlers weiter ausgeführt. In den meisten Fällen ist das also kein Problem, aber wenn Sie die Dinge richtig machen wollen, aktivieren Sie es, failglob
bevor Sie die Befehle ausführen, die die Globbing-Muster enthalten:
shopt -s failglob
AusBash-Referenzhandbuch: Dateinamenerweiterung:
Wenn die
failglob
Shell-Option gesetzt ist und keine Übereinstimmungen gefunden werden, wird eine Fehlermeldung ausgegeben und der Befehl nicht ausgeführt.
So extrahieren Sie alle ZIP-Dateien im aktuellen Arbeitsverzeichnis in ein einzelnes Verzeichnis:
unzip '*.zip' -d /path/to/target/directory
Beachten Sie, dass es *.zip
in einfache Anführungszeichen eingeschlossen ist, sodass unzip
das Muster selbstständig erweitert werden kann (sonst würde der Befehl fehlschlagen).
Alles zusammenfügen:
#/bin/bash
shopt -s failglob
mv *.jpg /path/to/target/directory
mv *.png /path/to/target/directory
unzip '*.zip' -d /path/to/target/directory
Antwort2
Es reichen drei Befehle aus, die find SOURCE_FOLDER -type f -exec COMMAND {} \;
Struktur verwenden. Unten finden Sie ein Skript, das alle drei Befehle kombiniert. Jeder Befehl wird stillschweigend beendet, wenn keine Dateien gefunden werden – so einfach ist das. Das bedeutet, dass Sie PNG-Dateien, aber keine JPEG-Dateien haben, PNG-Dateien trotzdem ohne Fehler an die gewünschte Stelle verschieben können.
Hier ist eine kleine Demo, in der Sie sehen können, dass ich 2 Bilddateien und 1 Zip-Datei habe. Das Skript entpackt das Archiv, sammelt dann alle PNG- und JPEG-Dateien und wirft sie in die entsprechenden Verzeichnisse
$> ls
JPEGS/ Pictures.zip PNGS/ rMzMHd7.jpg waves.png*
$> pwd
/home/xieerqi/TESTDIR
$> bash /home/xieerqi/cleanup_directory.sh
Archive: /home/xieerqi/TESTDIR/Pictures.zip
inflating: /home/xieerqi/TESTDIR/ASDF.png
inflating: /home/xieerqi/TESTDIR/IMG20160117233913~01.jpg
inflating: /home/xieerqi/TESTDIR/resized_Screenshot from 2016-01-10 08:52:10.png
$> ls
JPEGS/ Pictures.zip PNGS/
$> ls JPEGS
IMG20160117233913~01.jpg rMzMHd7.jpg
$> ls PNGS/
ASDF.png resized_Screenshot from 2016-01-10 08:52:10.png waves.png*
$>
Und hier ist das Skript selbst:
# Set here the working directory and the destinations
DIR="/home/xieerqi/TESTDIR"
PNG_DIR="/home/xieerqi/TESTDIR/PNGS"
JPEGS_DIR="/home/xieerqi/TESTDIR/JPEGS"
# Find all zip files in dir and extract them
# If not found, the script just continues on
find $DIR -maxdepth 1 -type f -iname "*.zip" -exec unzip {} -d $DIR \;
# Find all png files in the dir and move them to PNG_DIR
# use cp instead of mv if you are worried about loosing files
find $DIR -maxdepth 1 -type f -iname "*.png" -exec mv -t $PNG_DIR {} \+
# Find all JPEG/JPG files and throw them into JPENGS_DIR
# use cp if you are worried about loosing files
find $DIR -maxdepth 1 -type f \( -iname "*.jpg" -o -iname "*.jpeg" \) -exec mv -t $JPEGS_DIR {} \+