Erstellen Sie ein Skript zum Verschieben von Dateien, bei dem Fehler ignoriert werden

Erstellen Sie ein Skript zum Verschieben von Dateien, bei dem Fehler ignoriert werden

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 *.jpgBefehlen 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 *.jpgGlobbing-Muster zu einem Literal erweitert wird *.jpg, wodurch der Befehl einen Fehler ausgibt, falls eine Datei mit dem Namen *.jpgnicht 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, failglobbevor Sie die Befehle ausführen, die die Globbing-Muster enthalten:

shopt -s failglob

AusBash-Referenzhandbuch: Dateinamenerweiterung:

Wenn die failglobShell-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 *.zipin einfache Anführungszeichen eingeschlossen ist, sodass unzipdas 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 {} \+

verwandte Informationen