Использование регулярных выражений с cp

11

Это простой вопрос. Я пытаюсь скопировать все файлы в текущем каталоге, которые начинаются с «axis-2» и заканчиваются на «.jar», в целевой каталог, скажем, это ~ / MyDirectory. Моей первой мыслью было попробовать

cp '^axis2.*jar$' ~/MyDirectory

Но это не работает. Я даже не уверен, что могу использовать регулярные выражения с cp. Я также действительно не использовал регулярные выражения некоторое время, и мой синтаксис мог быть полностью выключен. Когда я пытаюсь этот cp просто выводит сообщение об ошибке «Нет такого файла или каталога». У кого-нибудь есть предложения, как это сделать? Спасибо!

Ник Ван Хугенстин
источник

Ответы:

15

Оболочка UNIX использует шаблоны глобуса , а не регулярные выражения. Итак, если вы хотите сопоставить имена файлов, начинающиеся с axis2и заканчивающиеся на .jar, вы используете:

cp axis2*.jar /destination/directory
Риккардо Мурри
источник
Большое спасибо! Я понял это самостоятельно, но я не знал о шаблонах глобуса, так что это полезно и информативно.
Ник Ван Хугенстин
7

Если у вас есть GNU findи GNU cp, вы можете использовать регулярные выражения, как в следующей команде:

find . -maxdepth 1 -regextype posix-basic -regex '.*/axis2[^/]*jar$' \
       -exec cp -t ~/MyDirectory {} +

Это может быть удобно, если ни шаблон глобуса, ни шаблон расширенного глобуса bash не соответствуют вашим потребностям.

enzotib
источник
0

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

rename "s/OldFile/NewFile/" OldFile*

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

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

copy "s/OldFile/NewFile/" OldFile*

Поэтому я продублировал этот скрипт и изменил оператор переименования для копирования через File::Copy. И вуаля! Команда копирования с синтаксисом perl-regex: jcward / vopy .

Джефф Уорд
источник