A razão pela qual seu script está falhando é que $9-bkp
é tratado como uma expressão: o -bkp
também deve ser citado, então a linha deve ser:
ls -lt *.xls | head -10 | awk '{print "mv " $9 " "$9"-bkp"}' | sh
No entanto, isso é desnecessariamente complicado: você está listando muitos atributos de arquivo, então use awk
para extrair o nome. Além disso, você não precisa iniciar um subshell para executar os comandos gerados. Além disso, o comando acima não funcionará se houver espaços em um nome de arquivo.
O seguinte aborda todos esses pontos:
ls -t *.xls | head -10 | while read; do mv "$REPLY" "$REPLY-bkp"; done
Nesse caso, ls -t
lista apenas os nomes dos arquivos, um por linha; read
copia cada linha completa REPLY
, incluindo todos os espaços, sejam incorporados, principais ou finais; e a mv
comando é executado para cada linha.
Note que o mais comum read name
irá copiar uma linha para name
, mas sem espaços iniciais e finais.