добавление текста к имени файла перед расширением

Можно использовать следующий синтаксис строкового литерала:

> 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
26
27.11.2012, 01:55
6 ответов

Используя стандартное расширение параметра POSIX:

for f in *.shp; do printf '%s\n' "${f%.shp}_poly.shp"; done
28
27.01.2020, 19:39
  • 1
    Потрясающий, который является точно, в чем я нуждался. в заголовке –  Sam007 26.11.2012, 23:05
  • 2
    Могло бы быть лучше с объяснением, как оно работает. Ответ Doug довольно легок, с другой стороны. –  Display Name 23.06.2015, 15:41
  • 3
    @SargeBorsch, В чем Вы нуждаетесь объясненный? Мой ответ, отрывок в вопросе и ответ Doug, только отличаются несколькими символами, и ответ Doug объясняет еще менее, чем мой, таким образом, я не знаю то, что это - Вы, хотят. Если Вы просто сравниваете различие в этих двух выводах в вопросе, должно быть тривиально легко выяснить то, что они делают. Я могу объяснить, почему мой ответ предпочтителен для Doug. 1. Я использую printf со строкой формата вместо менее портативного echo. 2. Я использую расширение параметра, которое более эффективно, чем вызов внешнего двоичного файла (basename) для такой простой задачи. –  jw013 23.06.2015, 17:43

Иногда существует названный инструмент, "переименовывают" установленный.

rename 's/\.shp$/_poly.shp/' *shp

Это не могло бы быть портативно, но это просто в использовании.

6
27.01.2020, 19:39
  • 1
    Это - единственное, которое работало на меня, большой ответ! –  wanderer0810 22.12.2017, 08:57

Используйте это:

for file in *.shp; do echo $(basename $file .shp)_poly.shp; done
4
27.01.2020, 19:39
  • 1
    Используя basename медленнее и менее эффективен, чем разрешение оболочке сделать работу отдельно. Это может быть примечательно для очень больших количеств файлов. –  jw013 26.11.2012, 23:14
  • 2
    Кроме того, там пропускают кавычки и --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
1
27.01.2020, 19:39

У меня это сработало лучше:

для f in *; сделать NEW = $ {f% .webm} _2016.webm; mv $ {f} "$ {NEW}"; выполнено

3
27.01.2020, 19:39

Так как вопрос для bashнет необходимости во внешних утилитах, так как вы можете использовать регулярные выражения bash:

for i in *.shp
do
    mv -v "${i}" "${i%.*}_MYSUFFIX.${i##*.}"
done
3
27.01.2020, 19:39

Теги

Похожие вопросы