Как переименовать расширение для группы файлов?

Почему вы настаиваете на функции с несколькими возвращаемыми значениями? С помощью OOP вы можете использовать класс, предлагающий регулярную функцию с единственным возвращаемым значением, и любое количество дополнительных «возвращаемых значений», как показано ниже. Преимущество заключается в том, что у вызывающего есть возможность взглянуть на дополнительные элементы данных, но это не требуется для этого. Это предпочтительный метод для сложной базы данных или сетевых вызовов, где может потребоваться много дополнительной информации о возврате в случае возникновения ошибок.

Чтобы ответить на ваш исходный вопрос, в этом примере есть метод возврата частного, это то, что может понадобиться большинству абонентов, и, кроме того, после вызова метода вы можете получить остаток в качестве элемента данных.

class div{
   public:
      int remainder;

      int quotient(int dividend, int divisor){
         remainder = ...;
         return ...;
      }
};
433
задан Ellie Kesselman 15 May 2019 в 07:06
поделиться

6 ответов

Для лучшего решения (только с функциональностью bash, а не с внешними вызовами) см. один из других ответов .


Следующее будет подходить и не работает требовать, чтобы в системе была программа переименовать (хотя чаще всего это бывает в системе):

for file in *.html; do
    mv "$file" "$(basename "$file" .html).txt"
done

РЕДАКТИРОВАТЬ: Как указано в комментариях, это не работает для имен файлов с пробелами в них без надлежащего цитирования (добавлено выше). При работе исключительно с вашими собственными файлами, которые, как вы знаете, не имеют пробелов в именах файлов, это сработает, но всякий раз, когда вы пишете что-то, что может быть повторно использовано позже, не пропускайте правильное цитирование.

359
ответ дан 22 November 2019 в 23:04
поделиться

Можно также сделать функцию в Bash, добавить его к .bashrc или что-то и затем использовать его везде, где Вы хотите.

change-ext() {
    for file in *.$1; do mv "$file" "$(basename "$file" .$1).$2"; done
}

Использование:

change-ext css scss

Источник кода в функции: https://stackoverflow.com/a/1224786/6732111

0
ответ дан 22 November 2019 в 23:04
поделиться

К сожалению, сделать переносимость - нетривиальная задача. Вероятно, вам понадобится немного магии expr.

for file in *.html; do echo mv -- "$file" "$(expr "$file" : '\(.*\)\.html').txt"; done

Удалите эхо, как только вы будете довольны, что оно делает то, что вы хотите.

Изменить: basename , вероятно, немного более читабельно для этого конкретного случая, хотя expr в целом более гибкий.

1
ответ дан 22 November 2019 в 23:04
поделиться

Вы хотите использовать переименовать :

rename -S .html .txt *.html

Это сделает именно то, что вы хотите - оно изменит расширение с .html на .txt для всех файлов, соответствующих *. html .

Примечание: Грег Хьюгилл правильно указывает, что это не встроенная функция bash; и является отдельной командой Linux. Если вам просто нужно что-то в Linux, это должно работать нормально; если вам нужно что-то более кроссплатформенное, взгляните на один из других ответов.

91
ответ дан 22 November 2019 в 23:04
поделиться
rename 's/\.html$/\.txt/' *.html

делает именно то, что вы хотите.

183
ответ дан 22 November 2019 в 23:04
поделиться

При использовании bash нет необходимости во внешних командах, таких как sed, basename, rename, expr и т.д.

for file in *.html
do
  mv "$file" "${file%.html}.txt"
done
636
ответ дан 22 November 2019 в 23:04
поделиться
Другие вопросы по тегам:

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