Cree un script para mover archivos que ignoren los errores

Cree un script para mover archivos que ignoren los errores

Puedo mover archivos en la terminal con bastante facilidad. Tengo un montón de cosas enviadas por los estudiantes diariamente y me haría la vida mucho más fácil tener algo que pueda ejecutar por la noche y que mueva todas las fotografías enviadas (normalmente JPG y PNG) a un directorio, y todo el texto a otro.

Podría escribir algo básico con mv *.jpgalgún tipo de comando, pero si no hay ninguno de esos tipos de archivos allí, supongo que todo el script fallaría y todo el ejercicio para ahorrar tiempo sería inútil.

Para agregar una complicación, un par de mis estudiantes superiores envían en zip, por lo que me gustaría poder hacer que el script los extraiga primero.

Entonces, TL;DR: extrae zips y mueve archivos sin que te detengan por errores causados ​​por no haber un tipo de archivo en particular.

Respuesta1

Supongo que todo el guión fallaría.

No lo hará, solo ese único comando "fallará" (lo que significa que el *.jpgpatrón global se expandirá a un literal *.jpg, lo que hará que el comando arroje un error en caso de que un archivo llamado *.jpgno exista), pero el script seguirá ejecutándose a pesar del error. Entonces, en la mayoría de los casos, eso no es una preocupación; sin embargo, si desea hacer las cosas de la manera correcta™, habilítelas failglobantes de ejecutar los comandos que contienen los patrones globales:

shopt -s failglob

DeManual de referencia de Bash: Expansión de nombre de archivo:

Si la failglobopción Shell está configurada y no se encuentran coincidencias, se imprime un mensaje de error y el comando no se ejecuta.

Para extraer todos los archivos .zip del directorio de trabajo actual a un único directorio:

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

Observe que *.zipestá entre comillas simples, por lo que unzippuede expandir el patrón por sí solo (de lo contrario, el comando fallaría).

Poniendo todo junto:

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

Respuesta2

Es suficiente tener 3 comandos que utilicen find SOURCE_FOLDER -type f -exec COMMAND {} \;estructura. A continuación se muestra un script que combina los 3. Cada comando se cerrará silenciosamente si no se encuentran archivos, así de simple; eso significa que si tiene archivos png pero no archivos jpeg, aún así moverá los png donde deben estar sin errores.

Aquí hay una pequeña demostración, donde puede ver que tengo 2 archivos de imagen y 1 archivo zip. El script descomprime el archivo y luego recopila todos los png y jpegs y los coloca en los directorios apropiados.

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

Y aquí está el guión en sí:

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

información relacionada