for i in $1/f[0-9][0-9][0-9].a; do
mv $i ${i%.a}_a.img
done
Однако это не рассматривает пробелы в именах файлов/папок. В этом случае вам придется использовать while
, чтобы вы получили одно имя файла в строке (см. Ниже бонус). Есть, вероятно, десятки других способов, в том числе rename
.
find $1 -maxdepth 1 -type f -name "f[0-9][0-9][0-9].a"|while read i; do
mv "$i" "${i%.a}_a.img"
done
Edit: Возможно, я должен объяснить, что я там делал. Это называется строка замещения и основные варианты использования их для переменной var
:
# Get first two characters
${var:0:2}
# Remove shortest rear-anchored pattern - this one would give the directory name of a file, for example
${var%/*}
# Remove longest rear-anchored pattern
${var%%/*}
# Remove shortest front-anchored pattern - this in particular removes a leading slash
${var#/}
# Remove longest front-anchored pattern - this would remove all but the base name of a file given its path
# Replace a by b
${var//a/b}
${var##*/}
Для более см man
страницу.
'mv' это не эта магия. [Ларри Уолл написал сценарий переименования в Perl] (http://docstore.mik.ua/orelly/perl/cookbook/ch09_10.htm), который может быть немного более волшебным, но требует написание крошечного фрагмента кода Perl каждый раз вы используете его. – sarnold