Использование регулярных выражений с 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 не соответствуют вашим потребностям.


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 .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.