Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 08/11/2009, à 07:52

JonTn

Opérateur d'exclusion avec root donne "-bash: !': event not found"

Petit problème assé étrange.

D'abors, j'utilise Karmic koala.

Je cherchais a faire un petite commande pour traiter tout les fichiers d'un répertoire.

En gros je cherche à éffacer tout les fichiers d'un dossier sauf certains en utilisant l'opérateur d'exclusion "!".

Généralement je fais un truc du genre :
"rm `ls !(fichier1 | fichier2)`"

ou bien :
"for f in $(ls !(fichier1 | fichier2));do rm $f;don".

J'ai utilisé l'opérateur d'exclusion plusieurs fois en étant utilisateur régulier et je n'ai jamais eu de problèmes. Mais, ce soir, j'étais dans un dossier du
"/usr/share"
qui se trouve protégé et je devais passer la commande en tant que "root". Alors j'ai tapé
"sudo -i"
et entré la commande en question. La je reçoit
"-bash: !': event not found"
comme érreur. J'ai donc essaillé l'opérateur dans d'autres cas et d'autres commandes et j'ai toujours ce message alors qu'en tant qu'utilisateur régulier ca fonctionne.

Merci d'avance

Hors ligne

#2 Le 16/11/2009, à 23:08

JonTn

Re : Opérateur d'exclusion avec root donne "-bash: !': event not found"

Si ca vous semble embrouillé comme description, zavez qu'a dire j'vais essayer de clarifier...

Hors ligne

#3 Le 24/11/2009, à 11:33

loopx

Re : Opérateur d'exclusion avec root donne "-bash: !': event not found"

Hello,


L'exclusion, si elle existe vraiment en bash, m'intéresse très beaucoup ..


Une idée ? J'ai le même problème :

[0][root@serveur genawstats]$ mv * !(jboss-dev0101) ../genawstats-mv/
-bash: !: event not found

hmm


CentOS => tout type de serveur
Ubuntu => tout bon ordinateur
Lubuntu => sur du vieux matos ;-)
Wiki perso : http://pix.noip.me

Hors ligne

#4 Le 24/11/2009, à 13:21

Hoper

Re : Opérateur d'exclusion avec root donne "-bash: !': event not found"

Pourquoi vous faite pas des grep sur vos ls ? ou des find ?


Mes tutos et coups de gueule :
http://hoper.dnsalias.net/atdc/
Mastodon: @hoper@framapiaf.org

Hors ligne

#5 Le 24/11/2009, à 21:54

JonTn

Re : Opérateur d'exclusion avec root donne "-bash: !': event not found"

La question n'est pas vraiment de savoir s'il existe d'autres moyens. De toutes façons, en "GNU/Linux" on a le choix d'effectuer les tâches selon nos goûts, ce qui est en accord avec la philosophie véhiculé de RMS via le projet GNU; c'est-à-dire, la liberté.

Le véritable point ici est plutôt de savoir pourquoi ça ne fonctionne pas en "root" avec "sudo" alors que ça fonctionne avec un usager régulier.

Il est vrai que je n'ai pas mentionné que j'utilisais d'autres méthodes pour effectuer la tâche mais je croyais être suffisamment clair dans ma question qui se résume ainsi :
Pourquoi la commande X ne fonctionne pas dans un cas X et qu'elle fonctionne dans un cas Y pour faire une tâche W?
Non pas :
Comment faire la tâche W?

D'ailleurs, "!" fait une exclusion et non pas une inclusion comme le fait naturellement "grep" ou "find". Je ne parle pas seulement que de "ls" ou "rm" ici. Ce n'étais qu'un exemple pratique.

Je commence à écrire des scriptes bash et l'utilisation de l'opérateur d'exclusion facilite grandement les choses dans certains cas, mais s'ils ne peuvent fonctionner pour l'usager "root" c'est inutile.

Par-exemple je veux tout effacer le contenu d'un répertoire sauf les mp3, je n'ai qu'à faire :
"rm !(*.mp3)".
Attention ca ne filtre pas les sous-répertoires.

Alors qu'avec "grep" ou "find" ça a plutôt tendance à se complexifier car cette méthode requière la gestion de "pipe", "input", "output" et "expressions régulières" ce qui peut donner des choses comme :
"ls -b |grep -v .videos|xargs rm -f"
ou bien :
"find . ! -name "*.mp3" -and ! -name "."|xarg rm -f"
ce qui est évidemment plus complexe. Par contre, ces méthodes sont de mises si on a besoin d'y aller récursivement.

En passant, je dit toujours "root" avec "sudo" mais je j'ai pas essayé en tant que "root" sans "sudo".

J'aimerais aussi ajouter, pour donner écho aux incertitudes de loopx, oui l'opérateur d'exclusion existe vraiment.

En voici la preuve :

jontn@LeHardy:~/C2009/NYA-A2009/Lab/Lab 3$ ls
~$b3_NYA_093.doc    Lab3-MLOL_MAS.bak    NYA_Lab3-prep.odt
hs_err_pid11812.log   Lab3-MLOL.mw            PageTitreContratEquipe_093.odt
Java Printing.pdf        Lab3_NYA_093.doc

jontn@LeHardy:~/C2009/NYA-A2009/Lab/Lab 3$ ls !(*.doc|*.pdf)
hs_err_pid11812.log    Lab3-MLOL.mw          PageTitreContratEquipe_093.odt
Lab3-MLOL_MAS.bak   NYA_Lab3-prep.odt

Hors ligne

#6 Le 25/11/2009, à 11:32

Hoper

Re : Opérateur d'exclusion avec root donne "-bash: !': event not found"

Chez moi ça ne fonctionne ni en simple user, ni en root. Donc je ne sais pas quelle version de bash vous utilisez mais... pas cette installée sur mon serveur en 8.04 en tout cas. Accessoirement, si une commande fonctionne avec un utilisateur, et pas avec un autre, la cause la plus probable et que le shell utilisé ne soit pas le même (ou qu'une variable d'environnement change et que cela influe sur l'interprétation ? Pas sur ce que ca existe ça...)

Accessoirement : "|xarg rm -f" peut être remplacé par --delete, ce qui est déjà plus simple tongue


Mes tutos et coups de gueule :
http://hoper.dnsalias.net/atdc/
Mastodon: @hoper@framapiaf.org

Hors ligne

#7 Le 26/11/2009, à 20:23

JonTn

Re : Opérateur d'exclusion avec root donne "-bash: !': event not found"

Ça semble avoir du sens ce que tu dis. Je viens de vérifier dans ma slackware et ca ne fonctionne ni en user ni en root. Et pourtant je ne l'ai pas inventé cette fonction. J'ai commencer à l'utiliser après avoir lu quelques forums. En tout va falloir se rabattre sur find ou grep puisqu'on a l'assurance que ca fonctionne partout. Merci quand même du coup de main.

Hors ligne