Utilisation d'expressions régulières avec cp

11

Ceci est une question simple. J'essaie de copier tous les fichiers du répertoire actuel qui commencent par "axis-2" et se terminent par ".jar" dans un répertoire cible, disons que c'est ~ / MyDirectory. Ma première pensée a été d'essayer

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

Mais cela ne fonctionne pas. Je ne suis même pas sûr de pouvoir utiliser des expressions régulières avec cp. Je n'ai pas non plus vraiment utilisé d'expressions régulières depuis un moment et ma syntaxe pourrait être totalement éteinte. Lorsque j'essaie, ce cp génère simplement un message d'erreur "Aucun fichier ou répertoire". Quelqu'un a-t-il des suggestions sur la façon de procéder? Merci!

Nick Van Hoogenstyn
la source

Réponses:

15

Le shell UNIX utilise des modèles globaux , pas des expressions régulières. Donc, si vous voulez faire correspondre les noms de fichiers commençant par axis2et se terminant par .jar, vous utilisez:

cp axis2*.jar /destination/directory
Riccardo Murri
la source
Merci beaucoup! Je l'ai compris moi-même, mais je ne connaissais pas les modèles globaux, c'est donc utile et informatif.
Nick Van Hoogenstyn
7

Si GNU findet GNU sont cpdisponibles, vous pouvez utiliser des expressions régulières comme dans la commande suivante:

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

Cela peut être pratique si ni le modèle glob ni le modèle bash étendu glob ne répondent à vos besoins.

enzotib
la source
0

J'aime vraiment la syntaxe regex du renamescript perl (par Robin Barker et Larry Wall), par exemple:

rename "s/OldFile/NewFile/" OldFile*

OldFile.cet OldFile.hsont renommés NewFile.cet NewFile.h, respectivement

Je voulais simplement exactement la même chose avec une commande de copie:

copy "s/OldFile/NewFile/" OldFile*

J'ai donc dupliqué ce script et changé la déclaration de renommage pour copier via File::Copy. Et voilà! Une commande de copie avec la syntaxe perl-regex: jcward / vopy .

Jeff Ward
la source