Usando expressões regulares com cp

11

Esta é uma pergunta simples. Estou tentando copiar todos os arquivos no diretório atual que começam com "axis-2" e terminam com ".jar" em um diretório de destino, digamos que é ~ / MyDirectory. Meu primeiro pensamento foi tentar

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

Mas isso não está funcionando. Não tenho certeza se posso usar expressões regulares com o cp. Eu também não uso expressões regulares há algum tempo e minha sintaxe pode estar totalmente desativada. Quando tento este cp, apenas gera uma mensagem de erro "Não existe esse arquivo ou diretório". Alguém tem alguma sugestão de como fazer isso? Obrigado!

Nick Van Hoogenstyn
fonte

Respostas:

15

O shell UNIX usa padrões glob , não expressões regulares. Portanto, se você deseja combinar nomes de arquivos começando axis2e terminando com .jar, use:

cp axis2*.jar /destination/directory
Riccardo Murri
fonte
Muito obrigado! Eu descobri por conta própria, mas não sabia sobre padrões glob, então isso é útil e informativo.
Nick Van Hoogenstyn
7

Se você possui o GNU finde o GNU cpdisponíveis, pode usar expressões regulares como no seguinte comando:

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

Isso pode ser útil se nem o padrão glob nem o bash Extended Glob atenderem às suas necessidades.

enzotib
fonte
0

Eu realmente gosto da sintaxe regex do renamescript perl (de Robin Barker e Larry Wall), por exemplo:

rename "s/OldFile/NewFile/" OldFile*

OldFile.ce OldFile.hsão renomeados para NewFile.ce NewFile.h, respectivamente

Eu simplesmente queria exatamente a mesma coisa com um comando de cópia:

copy "s/OldFile/NewFile/" OldFile*

Então, eu dupliquei esse script e mudei a declaração de renomeação para copiar via File::Copy. Et voila! Um comando de cópia com sintaxe perl-regex: jcward / vopy .

Jeff Ward
fonte