Linux cp с регулярным выражением - PullRequest
5 голосов
/ 21 августа 2011

Я хотел бы скопировать некоторые файлы в каталог, переименовав файлы, но сохранив расширение.Возможно ли это с помощью простого cp, используя регулярное выражение?

Например:

cp ^myfile\.(.*) mydir/newname.$1

Так что я мог бы скопировать файл, сохраняя расширение, но переименовав его.Есть ли способ получить соответствующие элементы в регулярном выражении cp, чтобы использовать его в команде?Если нет, то я сделаю сценарий на Perl, я думаю, или если у вас есть другой способ ...

Спасибо

Ответы [ 3 ]

14 голосов
/ 21 августа 2011

Предположим, у вас есть myfile.a, myfile.b, myfile.c:

for i in myfile.*; do echo mv "$i" "${i/myfile./newname.}"; done

Это создает (при удалении echo) newname.a, newname.b, newname.c.

1 голос
/ 21 августа 2011

Оболочка не понимает общих регулярных выражений;для этого вам придется отдать на аутсорсинг вспомогательные программы.Классический сценарий для решения вашей задачи будет выглядеть примерно так:

for a in myfile.* ; do
  b=`echo $a | sed 's!^myfile!mydir/newname!'`
  cp $a $b
done

Или у сценария perl будет сгенерирован список команд, которые вы затем вводите в оболочку.

0 голосов
/ 06 апреля 2018

Мне очень нравится синтаксис регулярных выражений Perl-скрипта rename (Робин Баркер и Ларри Уолл), например:

rename "s/OldFile/NewFile/" OldFile*

OldFile.c и OldFile.h переименованы в NewFile.c и NewFile.h соответственно

Я просто хотел сделать то же самое с помощью команды копирования:

copy "s/OldFile/NewFile/" OldFile*

Поэтому я продублировал этот скрипт и изменил оператор переименования, чтобы он копировал с помощью File::Copy. И вуаля! Команда копирования с синтаксисом perl-regex:

https://gist.github.com/jcward/0ead33bd79f2061c68728cc82582241f

...