2 votes

Créer un script pour déplacer les fichiers qui ignorent les erreurs

Je peux déplacer des fichiers dans le terminal assez facilement. J'ai tout un tas de choses soumises par les étudiants chaque jour et cela me faciliterait beaucoup la vie d'avoir une chose que je puisse lancer le soir et qui déplacerait toutes les photos soumises (JPG et PNG normalement) dans un répertoire, et tous les textes dans un autre.

Je pourrais écrire quelque chose de basique avec mv *.jpg mais s'il n'y a aucun de ces types de fichiers, je suppose que l'ensemble du script échouerait et que l'exercice de gain de temps serait inutile.

Pour ajouter une complication, quelques-uns de mes étudiants de niveau supérieur soumettent des fichiers zip et j'aimerais pouvoir faire en sorte que le script les extraie d'abord.

Donc, TL;DR - extraire des zips et déplacer des fichiers sans être arrêté pour des erreurs causées par l'absence d'un type particulier de fichier.

2voto

ieplugin Points 216

Je suppose que l'ensemble du script échouerait.

Ce n'est pas le cas, seule cette commande unique " échouerait " (ce qui signifie que la commande *.jpg le modèle de globbing sera étendu à un littéral *.jpg ce qui fera que la commande lancera une erreur dans le cas où un fichier nommé *.jpg n'existe pas), mais le script continuera à s'exécuter malgré l'erreur. Donc, dans la plupart des cas, ce n'est pas un problème, cependant si vous voulez faire les choses The Right Way™, activez la fonction failglob avant d'exécuter les commandes contenant les motifs de globbing :

shopt -s failglob

De Manuel de référence Bash : Expansion de nom de fichier :

Si le failglob L'option Shell est définie, et aucune correspondance n'est trouvée, un message d'erreur est imprimé et la commande n'est pas exécutée.

Pour extraire tous les fichiers .zip du répertoire de travail actuel dans un seul répertoire :

unzip '*.zip' -d /path/to/target/directory

Remarquez que *.zip est placé entre guillemets simples, de sorte que unzip peut développer le motif par lui-même (la commande échouerait sinon).

Mettre tout en place :

#/bin/bash
shopt -s failglob
mv *.jpg /path/to/target/directory
mv *.png /path/to/target/directory
unzip '*.zip' -d /path/to/target/directory

0voto

Sergiy Kolodyazhnyy Points 97292

Il suffit d'avoir 3 commandes qui utilisent find SOURCE_FOLDER -type f -exec COMMAND {} \; structure. Ci-dessous se trouve un script qui combine les 3. Chaque commande se terminera silencieusement si aucun fichier n'est trouvé - aussi simple que cela ; cela signifie que si vous avez des fichiers png mais pas de fichiers jpeg, vous déplacerez quand même les png là où ils doivent être sans erreur.

Voici une petite démo , où vous pouvez voir que j'ai 2 fichiers images et 1 fichier zip. Le script dézippe l'archive, et ensuite collecte tous les png et jpegs et les jette dans les répertoires appropriés

$> 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*
$> 

Et voici le script lui-même :

# 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 {} \+

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X