Причина, по которой ваш скрипт не работает, заключается в том, что $9-bkp
рассматривается как выражение: -bkp
также должен быть заключен в кавычки, поэтому строка должна быть:
ls -lt *.xls | head -10 | awk '{print "mv " $9 " "$9"-bkp"}' | sh
Однако это излишне сложно: вы перечисляете много атрибутов файла, а затем используете awk
для извлечения имени. Кроме того, вам не нужно запускать подоболочку для выполнения сгенерированных команд. Кроме того, приведенная выше команда не будет работать, если в имени файла есть пробелы.
Следующие адреса относятся ко всем этим пунктам:
ls -t *.xls | head -10 | while read; do mv "$REPLY" "$REPLY-bkp"; done
В этом случае ls -t
перечисляет только имена файлов, по одному на строку; read
копирует каждую полную строку в REPLY
, включая все пробелы, как встроенные, так и начальные или конечные; и команда mv
запускается для каждой строки.
Обратите внимание, что более распространенное read name
будет копировать строку в name
, но без начальных и конечных пробелов.