Можно использовать следующий синтаксис строкового литерала:
> echo $'\'single quote phrase\' "double quote phrase"'
'single quote phrase' "double quote phrase"
man bash
Слова $ формы 'строка' рассматривают особенно. Слово расширяется до строки с оставленными из обратной косой черты символами, замененными, как указано ANSI C стандарт. Escape-последовательности обратной косой черты, если есть декодируются следующим образом:
\a alert (bell) \b backspace \e \E an escape character \f form feed \n new line \r carriage return \t horizontal tab \v vertical tab \\ backslash \' single quote \" double quote \nnn the eight-bit character whose value is the octal value nnn (one to three digits) \xHH the eight-bit character whose value is the hexadecimal value HH (one or two hex digits) \cx a control-x character
Используя стандартное расширение параметра POSIX:
for f in *.shp; do printf '%s\n' "${f%.shp}_poly.shp"; done
Иногда существует названный инструмент, "переименовывают" установленный.
rename 's/\.shp$/_poly.shp/' *shp
Это не могло бы быть портативно, но это просто в использовании.
Используйте это:
for file in *.shp; do echo $(basename $file .shp)_poly.shp; done
basename
медленнее и менее эффективен, чем разрешение оболочке сделать работу отдельно. Это может быть примечательно для очень больших количеств файлов.
– jw013
26.11.2012, 23:14
--
s и это перестало работать для имен файлов, которые имеют символы новой строки перед .shp
.
– Stéphane Chazelas
17.11.2016, 00:57
Если они находятся в разных местах, запустите: -
for i in ` find /root/test/ -name "*.shp" ` ;
do
mv $i ` echo $i | sed 's/.shp$/_poly.shp/g' ` ;
done
У меня это сработало лучше:
для f in *; сделать NEW = $ {f% .webm} _2016.webm; mv $ {f} "$ {NEW}"; выполнено
Так как вопрос для bash
нет необходимости во внешних утилитах, так как вы можете использовать регулярные выражения bash:
for i in *.shp
do
mv -v "${i}" "${i%.*}_MYSUFFIX.${i##*.}"
done
printf
со строкой формата вместо менее портативногоecho
. 2. Я использую расширение параметра, которое более эффективно, чем вызов внешнего двоичного файла (basename
) для такой простой задачи. – jw013 23.06.2015, 17:43