Подтвердить что ты не робот

Shell/Bash ярлык для массового переименования файлов в папке

Есть ли ярлык в Shell/ Bash, который может переименовать все файлы в папке на основе регулярного выражения или некоторых других критериев. То, что я ищу здесь, находится в моих папках документов, которые позволяют сказать 100 текстовых файлов со следующим соглашением об именах:

<longdocumentidentifier>-doc-<counter>.txt.

Мне нужно переименовать все файлы с приведенным выше соглашением:

doc-<counter>.txt

Есть ли один вкладыш, который может помочь мне с этим?

4b9b3361

Ответ 1

Я бы предложил что-то вроде этого:

for i in *-doc-*.txt; do mv $i ${i/*-doc-/doc-}; done

${i/*-doc-/doc-} заменяет первое вхождение *-doc- на doc-.

Если вам нужно сделать более одной замены (см. комментарий № 1), вам нужно использовать вариант ${var//Pattern/Replacement}. Если вам нужно заменить начало имени, вам нужно использовать ${var/#Pattern/Replacement}, если вам нужно заменить конец (т.е. Расширение), вам нужно использовать форму ${var/%Pattern/Replacement}.

Подробнее см. http://tldp.org/LDP/abs/html/parameter-substitution.html#EXPREPL1

Ответ 2

Если у вас есть rename, тогда rename 's/^.*-doc-/doc-/' *.txt должен сделать трюк.

Ответ 3

Существует prename, что позволяет использовать REGEX:

prename 's/^.*-doc-(.*\.txt)$/doc-$1/'  *.txt

Используйте параметр -n для имитации:

prename -n 's/^.*-doc-(.*\.txt)$/doc-$1/'  *.txt

Примечание.. Это поставляется как rename во многих дистрибутивах Linux, но не во всех из них, поэтому я использую каноническое имя для утилиты, которая поставляется с Perl.

Ответ 4

Команда переименования, встроенная в большинство Linux, например, сделает это легко.

Лично я предпочитаю регулярные выражения, поэтому я очень долго несли вокруг этого script (читайте: начиная с конца 80-х или начала 90-х):

#!/usr/bin/perl

($op = shift) || die "Usage: $0 expr [files]]\n";

if([email protected])
  {
  @ARGV = <STDIN>;
  chop(@ARGV);
  }

for (@ARGV)
  {
  $was = $_;
  eval $op;
  die [email protected] if [email protected];

  if ($was ne $_)
    {
    print "rename($was,$_)\n";
    rename($was,$_);
    }
  }

Что при установке позволяет делать такие вещи:

script-name 's/.*-doc(.*).txt/doc$1.txt/' *.txt

Ответ 5

Если вы хотите переписать в подкаталоги, есть также:

find . -maxdepth N -type f -name "$pattern" | sed -e 'p' -E -e "s/$str1/$str2/g" | xargs -n2 mv

В системе, которая автоматически поддерживает расширенные регулярные выражения, вы можете оставить -E.

Преимущества:

  • возвращает в подкаталоги
  • вы можете управлять maxdepth рекурсии
  • вы можете переименовывать файлы и/или каталоги (-type f | d)

Недостатки:

  • несколько более сложные регулярные выражения, потому что вам нужно вычеркнуть путь, чтобы получить имя файла

(ответ изменен с здесь)

Ответ 6

mmv "*-doc-*" "doc-#2"

Команда mmv означает "массовый ход"

Ответ 7

Если вы не возражаете против внешнего инструмента, то здесь один: rnm (веб-страница)

Для вашей конкретной задачи команда будет следующей:

rnm -rs '/.*-doc-/doc-/' *.txt

или

rnm -rs '/.*-(doc-.*\.txt)/\1/' *.txt

Ниже вы можете найти примеры/документы здесь.

Ответ 8

найти. -name '* scss' | xargs -L1 -I {} echo {} {} | sed 's/css.scss $/scss/' | xargs -L1 mv

например, если у вас есть куча файлов, заканчивающихся на ".css.scss", и вы хотите переименовать их для завершения просто ".scss" (т.е. удалить часть .css).

настроить регулярное выражение и найти аргументы для ваших нужд