Use o '*' no script de shell

Oct 14 2020

Estou tentando executar um exemplo de comando:

sudo mv /home/vaishnavi/Downloads/*.ttc /home/vaishnavi/Downloads/*.ttf /usr/local/share/fonts/ms_fonts/

Funciona bem no terminal, mas quando tento adicionar isso em um script de shell ( .sh), recebo um erro dizendo:

mv: cannot stat '/home/vaishnavi/Downloads/*.ttf': No such file or directory

Simplesmente, desejo mover todos os arquivos de .ttfe .ttcdigitar para /usr/local/share/fonts/ms_fonts/, neste caso. Falando francamente, não sou tão especialista em scripts de shell. Explique-me o que fiz de errado e também uma alternativa para alcançar os resultados esperados.

Meu script de exemplo:

sudo mv /home/vaishnavi/Downloads/*.ttc /home/vaishnavi/Downloads/*.ttf /usr/local/share/fonts/ms_fonts/  
...

exit 0

Respostas

3 glennjackman Oct 14 2020 at 19:32

Você obterá este erro se não houver arquivos * .ttf lá. Por padrão, se nenhum arquivo corresponder a um padrão glob, o próprio padrão permanecerá no comando. Desligue isto com a nullglobopção bash shell

Para ficar um pouco mais seguro, verifique se realmente há alguns arquivos para mover:

#!/usr/bin/env bash
...
shopt -s nullglob
# store files in an array
files=( /home/vaishnavi/Downloads/*.{ttc,ttf} )
# and if the array is not empty, move the files.
if (( ${#files[@]} > 0 )); then sudo mv -t /usr/local/share/fonts/ms_fonts/ "${files[@]}" 
fi