Shell/Bash ярлык для массового переименования файлов в папке
Есть ли ярлык в Shell/ Bash, который может переименовать все файлы в папке на основе регулярного выражения или некоторых других критериев. То, что я ищу здесь, находится в моих папках документов, которые позволяют сказать 100 текстовых файлов со следующим соглашением об именах:
<longdocumentidentifier>-doc-<counter>.txt.
Мне нужно переименовать все файлы с приведенным выше соглашением:
doc-<counter>.txt
Есть ли один вкладыш, который может помочь мне с этим?
Ответы
Ответ 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).
настроить регулярное выражение и найти аргументы для ваших нужд