2010-09-16 15 views
0

Je veux exécuter la commande suivante dans le script shellquestion de script Shell

cp /somedire/*.(txt|xml|xsd) /destination/dir/

Mais cela ne va pas à l'intérieur de script shell. Toute aide rapide?

createjob.sh: ligne 11: erreur de syntaxe près de jeton inattendu '(»

Ma coquille est zsh

Merci Nayn

+0

Le script est-il également exécuté par zsh? – ngroot

+0

la commande est bien exécutée dans zsh. mais dans le script shell il crèche – Nayn

Répondre

2

Votre utilisation des parenthèses et de l'alternance est une construction spécifique à zsh. Il ne fonctionne pas dans les autres shells, y compris zsh en mode de compatibilité sh. Si vous voulez continuer à utiliser cette construction, vous devrez appeler zsh comme zsh (probablement en remplaçant #!/bin/sh par #!/bin/zsh ou quelque chose comme ça).

Si vous avez besoin de votre script à exécuter sur ksh, utilisez #!/bin/ksh ou #!/usr/bin/env ksh et

cp /somedire/*[email protected](txt|xml|xsd) /destination/dir/ 

Si vous devez également soutenir bash, cette même commande avec le @ fonctionnera à condition que vous exécutez les commandes suivantes en premier:

shopt -s extglob 2>/dev/null ## tell bash to parse ksh globbing extensions 
setopt ksh_glob 2>/dev/null ## tell zsh to parse ksh globbing extensions 

Si vous avez besoin de la compatibilité POSIX, vous devrez utiliser trois commandes séparées, et se préparer à un message d'erreur si l'une des trois extensions n'a pas de correspondance. Une solution plus robuste utiliserait trouver:

find /somedire -name /somedire -o -type d -prune -o \ 
    \(-name '*.txt' -o -name '*.xml' -o '*.xsd' \) \ 
    -exec sh -c 'cp "[email protected]" "$0"' /destination/dir {} + 
0

Aucune idée de zsh, mais Bash ne sait pas. expressions régulières dans les chemins, seulement wildcards

Vous pouvez essayer d'utiliser find:.

find -E . -regex '.*\.(txt|xml|xsd)' -exec cp {} /destination/dir \; 

Jetez un oeil à la page de manuel pour une explication de la syntaxe de find.

+0

'*. (txt | xml | xsd)' est un motif de shell dans zsh, et cela signifie ce que vous en pensez. Notez que '-E' n'est pas standard (il semble être spécifique à FreeBSD). Votre commande diffère de l'original en ce qu'elle est récursée dans des sous-répertoires. – Gilles

+0

@Gilles: '-E' est en effet non-standard mais utiliser les commandes Unix (' sed', 'grep' ...) sans qu'il y ait vraiment de mal dans le * ss car tout ce que vous obtenez est une version regex du dernier millénaire. –

0

Cela travaillerait en bash et zsh probablement aussi: cp /somedire/*.{txt,xml,xsd} /destination/dir/

Il est pas POSIX, cependant, il ne fonctionnera pas avec la plupart des /bin/sh « s .

+0

Cela fonctionnera si et seulement s'il y a des fichiers et txt, et xml, et xsd, alors que la version '(|)' échouera seulement s'il n'y a pas de fichiers avec de telles extensions. – ZyX

+0

Donc on travaille s'il ya _are_ fichiers, l'autre échoue s'il n'y a pas de fichiers ... Je ne comprends pas la différence que vous signalez. –

+0

votre commande doit échouer s'il existe, par exemple, des fichiers * .txt et * .xml, mais pas de fichiers * .xsd. Selon les options du shell, il peut quitter '/ somedire/*.xsd' pattern (comme bash), nothing (dans ce cas cela fonctionne comme la version '(|)') (avec l'option 'nullglob') ou refuse d'exécuter une commande avec une erreur' no matches found' (par défaut pour zsh). – ZyX