
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 *.jpg
algú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 *.jpg
patrón global se expandirá a un literal *.jpg
, lo que hará que el comando arroje un error en caso de que un archivo llamado *.jpg
no 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 failglob
antes 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
failglob
opció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 *.zip
está entre comillas simples, por lo que unzip
puede 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 {} \+