Crie um script para mover arquivos que ignoram erros

Crie um script para mover arquivos que ignoram erros

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 *.jpgalguns 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 *.jpgpadrão globbing será expandido para literal *.jpg, o que fará com que o comando gere um erro caso um arquivo nomeado *.jpgnã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 failglobantes 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 failglobopçã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 *.zipestá entre aspas simples, para que unzippossa 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 {} \+

informação relacionada