o problema é a linha
if [ -f 'sources/*.bak' ]
backticks '
tem um significado especial no bash: eles são usados para avaliar um comando e retornar sua saída.
Por exemplo Se seu nome de usuário for frodl ,
if [ -f 'whoami' ]
irá verificar se existe um arquivo chamado frodl
.
Portanto, se você escrever sources/*.bak
, ele tentará primeiro agrupar o termo sources/*.bak
, mas como não há arquivos no diretório sources/
com uma extensão .bak
, o termo não será expandido. Em seguida, ele tentará executar o termo literal sources/*.bak
, que não é um comando válido (na verdade, você pode ter um arquivo chamado sources/*.bak
(um nome de arquivo com um asterisco no início; shudder!) mas parece que não, mas este arquivo teria uma extensão .bak
, algo que descartamos antes.)
Se você tiver um arquivo sources/deletemyharddisk.bak
, o termo sources/*.bak
será expandido para essa sequência e, em seguida, tentará executá-lo (potencialmente excluindo seu disco rígido).
Então, o que você precisa fazer é usar aspas comuns.
backupfiles=sources/*.bak
if [ "x${backupfiles}" = "xsources/*.bak" ]; then
echo "no .bak files" 1>&2
else
echo "there are .bak files"...
fi
Isso tentará primeiro expandir o termo sources/*.bak
para a variável backupfiles
. Se houver algum arquivo bak, isso se tornará uma string de todos os nomes de arquivos; se não houver nenhum, isso permanecerá na sequência não expandida.
Se você comparar o resultado com o literal (não expandido) sources/*.bak
, você pode dizer se uma expansão ocorreu (porque há arquivos correspondentes) ou não.
uma abordagem melhor
No entanto, há poucos motivos para primeiro verificar se há arquivos e excluí-los.
Uma abordagem mais simples é simplesmente remover todos os arquivos que correspondem a um determinado padrão.
find
pode fazer isso por você:
find sources/ -maxdepth 1 -type f -name "*.bak" -delete
(isso pesquisará no primeiro nível ( -maxdepth 1
) do diretório sources/
dos arquivos ( -type f
; em vez de diretórios ou links simbólicos ou outras coisas), que terminam em .bak
( -name "*.bak"
) e em seguida, remova-os ( -delete
)
Não analisar ls
Outro problema com o seu código é
target_files='echo -n $(ls sources/{*.c,*.h})'
for i in $target_files
...
Você deve nunca analisar a saída de ls
.
Em vez disso, use algo como
for i in sources/*.c sources/*h
do
#...
done