for filename in "$1"/*; do if [ -f "$filename" ] && [ "${filename%.old}" = "$filename" ] then mv -- "$filename" "$filename.old" fi done
Используйте
grep
для текста и используйте выводls
для чтения глазами, а не в качестве входных данных для программы.Ошибка, которую вы получаете, связана с синтаксической ошибкой в вашем коде. Синтаксис цикла
for
(для перебора нескольких слов )таков:for variable in word-list; do...; done
Код вверху будет циклически перебирать все обычные файлы в каталоге, указанном в
$1
, и присваивать им суффикс имени файла.old
, если у них его еще нет. Два теста проверяют, относится ли$filename
к обычному файлу (или символической ссылке к одному из них ), и остается ли$filename
при удалении.old
из конца его значения прежним (. т.е. имеет ли он уже суффикс или нет ).Другой способ сделать более или менее то же самое с помощью
find
:find "$1" -maxdepth 1 -type f ! -name '*.old' -exec mv {} {}.old ';'
Обратите внимание, что оба решения будут перезаписывать любой уже существующий файл
.old
, если есть соответствующее имя файла без суффикса.old
. Если бы существовал каталог с суффиксом.old
под$1
, файл был бы помещен в этот каталог, а не переименован.Разница между решением
find
и циклом оболочки заключается в том, что решениеfind
также заботится о скрытых именах, а цикл оболочки переименовывает символические ссылки в обычные файлы.Связанные: