Existem pelo menos dois grandes problemas no script. Seu problema fundamental é o snippet:
if [ $filename* =
Existem alguns problemas com isso. Primeiro, no shell-scripting, você não pode "glob" um padrão de correspondência. Bem, você pode, mas se o arco da vassoura resultar em mais de uma correspondência, você receberá as duas, caso em que o programa "[" (sim, é um programa) tentará avaliar:
filename1 filename2 filename3 = $i
Funciona se e somente se o filglob se expandir para exatamente um nome de arquivo, e você raramente pode garantir isso. No seu caso, $ filename se expande para pelo menos um arquivo, mas você deve estar ciente de que nem sempre é o caso. Se "$ file *" se expande para nenhum arquivo, você pode (dependendo de uma configuração shopt) obter a string vazia:
= $i
que fará com que [
falhe. Com o shopt certo, você consegue:
backup-2014-whatever* = $i
Com o *
sendo parte da comparação.
O segundo problema fundamental é o uso do parâmetro -F
em ls
. Isso diz ao ls para acrescentar ao nome do arquivo um dos vários caracteres, dependendo se o arquivo é um executável, um link flexível, etc.
O NetScr1be está em algo, mas veja, você não precisa seguir o conselho do NetScr1be e nunca usar ls
... apenas não use ls -l
. Em vez disso, use ls -1
, que imprimirá apenas os nomes dos arquivos em uma única coluna, sem frescuras. (Para diretórios muito grandes, ele os classificará, e isso pode ser um problema, caso em que há uma opção no-sort; ou use find.)
Para ser mais seguro, suas variáveis devem ter aspas duplas, e tanto o LHS quanto o RHS são prefixados com um caractere fictício, para garantir que nomes de arquivos estranhos que começam com -
não sejam descartados.
Eu usaria o conselho de Glenn, mais ou menos, e faria assim:
command ls -1 | while read file; do
if [ x"$file" = x"$filename" ]]; then
echo Do Work Here
fi
done
É assim que eu faria , mas Glenn gentilmente me informou, eu realmente deveria fazê-lo
:
for file in *; do
if [[ $file == $filename ]]; then ...