
Posso mover arquivos no terminal com bastante facilidade. Eu tenho uma grande quantidade de coisas enviadas por alunos diariamente e tornaria minha vida muito mais fácil ter algo que eu possa administrar à noite e que mova todos os envios de fotos (JPGs e PNGs normalmente) para um diretório, e todo o material de texto para outro.
Eu poderia escrever algo básico com mv *.jpg
alguns comandos, mas se não houver nenhum desses tipos de arquivo, presumo que todo o script falharia e todo o exercício de economia de tempo seria inútil.
Para adicionar uma complicação, alguns dos meus alunos mais avançados enviam arquivos zip, então eu gostaria de poder fazer com que o script os extraísse primeiro.
Portanto, TL; DR - extrai zips e move arquivos sem ser interrompido por erros causados por não haver um tipo específico de arquivo.
Responder1
Estou assumindo que todo o script falharia
Não, apenas aquele único comando "falharia" (o que significa que o *.jpg
padrão globbing será expandido para literal *.jpg
, o que fará com que o comando gere um erro caso um arquivo nomeado *.jpg
não exista), mas o script continuará em execução apesar do erro. Portanto, na maioria dos casos, isso não é uma preocupação, no entanto, se você quiser fazer as coisas do jeito certo™, habilite failglob
antes de executar os comandos que contêm os padrões globbing:
shopt -s failglob
DeManual de referência do Bash: expansão do nome do arquivo:
Se a
failglob
opção shell estiver definida e nenhuma correspondência for encontrada, uma mensagem de erro será impressa e o comando não será executado.
Para extrair todos os arquivos .zip do diretório de trabalho atual para um único diretório:
unzip '*.zip' -d /path/to/target/directory
Observe que *.zip
está entre aspas simples, para que unzip
possa expandir o padrão por conta própria (caso contrário, o comando falharia).
Juntando tudo:
#/bin/bash
shopt -s failglob
mv *.jpg /path/to/target/directory
mv *.png /path/to/target/directory
unzip '*.zip' -d /path/to/target/directory
Responder2
Basta ter 3 comandos que utilizam find SOURCE_FOLDER -type f -exec COMMAND {} \;
estrutura. Abaixo está um script que combina todos os 3. Cada comando será encerrado silenciosamente se nenhum arquivo for encontrado - simples assim; isso significa que se você tiver arquivos png, mas não arquivos jpeg, você ainda moverá png para onde eles precisam estar sem erros.
Aqui está uma pequena demonstração, onde você pode ver que tenho 2 arquivos de imagem e 1 arquivo zip. O script descompacta o arquivo e, em seguida, coleta todos os png e jpegs e os lança nos diretórios apropriados
$> 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*
$>
E aqui está o script em si:
# 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 {} \+