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 13/10/2008, à 09:42

deax_one

[Résolu] Création collaborative d'un "ls inversé"

Salut à tous,

après pas mal de recherches sur le site et les forums, je n'ai toujours pas trouvé réponse à  ma question donc je me lance ici.

L'idée est de créer un alias-fonction qui permet de lister les fichiers sauf ceux contenant dans leur nom les arguments fournis à l'alias

Exemple :
j'ai 30 fichiers qui s'appellent toto001.machin à toto030.machin et 10 fichiers aaa01 à aaa10,
donc quand je fais un ls, tous ces fichiers apparaissent et m'encombrent.
Je fais donc un : sl toto aaa   (où sl est le nom de l'alias)
et il m'affiche tout sauf ces fichiers.

Pour l'instant, j'en suis là : (je suis par contre pas sûr d'avoir pris le chemin le plus facile!)

function sl() # lister sauf arguments
{
 list_excep=`for i in "$@"; do { echo -n "("$i")" ; } ; done`
 list_excep=`echo $list_excep | sed "s/)(/)|(/g"`
 list_excep=`echo $list_excep | sed "s/^(/"(/g"`
 ls | grep -iv '$list_excep'
}

Ne fonctionne pas, le problème venant à mon avis de l'interprétation du '$list_excep' dans le grep.
le paramètre list_excep vaut bien finalement ($1)|($2)|($3)....($n), soit, pour l'exemple (toto)|(aaa)
et donc l'idée c'est de finir par : ls | grep -iv '(toto)|(aaa)'

Si vous avez des idées...
Merci d'avance

Dernière modification par deax_one (Le 30/10/2008, à 13:45)


Jabber : mat@jabber.lutix.org
[img]http://lutix.org/images/mini_lutix.png[/img]

Hors ligne

#2 Le 13/10/2008, à 10:04

®om

Re : [Résolu] Création collaborative d'un "ls inversé"

deax_one a écrit :

j'ai 30 fichiers qui s'appellent toto001.machin à toto030.machin et 10 fichiers aaa01 à aaa10,
donc quand je fais un ls, tous ces fichiers apparaissent et m'encombrent.

ls -l | grep -v 'toto[[:digit:]]\{3\}.machin$'

Hors ligne

#3 Le 13/10/2008, à 10:28

deax_one

Re : [Résolu] Création collaborative d'un "ls inversé"

Merci pour ta réponse, mais le but est de faire un alias
afin de choisir quels fichiers n'apparaitront pas


Jabber : mat@jabber.lutix.org
[img]http://lutix.org/images/mini_lutix.png[/img]

Hors ligne

#4 Le 13/10/2008, à 10:36

®om

Re : [Résolu] Création collaborative d'un "ls inversé"

for i in "$@"
do
    if [ ! $first ]
    then
        s="^$i\$"
    else
        s="$s\|^$i\$"
    fi
done
ls -1 | grep -v "\($s\)"

Hors ligne

#5 Le 13/10/2008, à 12:17

Alain.g

Re : [Résolu] Création collaborative d'un "ls inversé"

Bonjour

Bash a des opérateurs avancés qui rendent assez simples ce genre de chose.

Par exemple lister tous les fichiers ne commençant pas par toto :

ls !(toto*)

ne commençant ni par toto ni par aaa

ls !(toto*|aaa*)

Xubuntu Karmic !

Hors ligne

#6 Le 13/10/2008, à 13:03

deax_one

Re : [Résolu] Création collaborative d'un "ls inversé"

Merci pour vos réponses,

pour le code de ®om :
il n'a pas l'air de fonctionner chez moi, il me liste tous les éléments

pour Alain.g :
en essayant "ls !(toto*)", j'ai une erreur : "bash event not found",
j'avais déjà testé ça et devant l'absence de succès, je mettais mis à faire une fonction...

des idées...?


Jabber : mat@jabber.lutix.org
[img]http://lutix.org/images/mini_lutix.png[/img]

Hors ligne

#7 Le 13/10/2008, à 16:03

mobidyc

Re : [Résolu] Création collaborative d'un "ls inversé"

$> ls
$> touch toto0{0..3}{0..9} aaa{0..9} aaa10
$> ls
aaa0   aaa2  aaa5  aaa8     toto001  toto004  toto007  toto010  toto013  toto016  toto019  toto022  toto025  toto028  toto031  toto034  toto037
aaa1   aaa3  aaa6  aaa9     toto002  toto005  toto008  toto011  toto014  toto017  toto020  toto023  toto026  toto029  toto032  toto035  toto038
aaa10  aaa4  aaa7  toto000  toto003  toto006  toto009  toto012  toto015  toto018  toto021  toto024  toto027  toto030  toto033  toto036  toto039
$> ls !(*toto*)
-bash: !: event not found
$> shopt extglob
extglob         off
$> shopt -s extglob
$> shopt extglob  
extglob         on
$> ls !(*toto*)
aaa0  aaa1  aaa10  aaa2  aaa3  aaa4  aaa5  aaa6  aaa7  aaa8  aaa9

cf bash(1) manpage:

If  the  extglob  shell option is enabled using the shopt builtin, several extended pattern matching operators are recognized.  In the following descrip-tion, a pattern-list is a list of one or more patterns separated by a |.  Composite patterns may be formed using one or more of  the  following  sub-pat-
       terns:

              ?(pattern-list)
                     Matches zero or one occurrence of the given patterns
              *(pattern-list)
                     Matches zero or more occurrences of the given patterns
              +(pattern-list)
                     Matches one or more occurrences of the given patterns
              @(pattern-list)
                     Matches one of the given patterns
              !(pattern-list)
                     Matches anything except one of the given patterns

en espérant avoir pu aider.

cdt,
mobidyc

Hors ligne

#8 Le 13/10/2008, à 17:55

cheuveulu

Re : [Résolu] Création collaborative d'un "ls inversé"

Salut, Je n'ai pas de moyens pour faire ce que tu envisage par contre je te met en garde sur l'utilisation de sl comme nom pour ton alias. Il existe un petit programme nommé sl justement pour ceux qui tapent par inadvertance sl au lieu de ls et qui fait passer un petit train en ascii sur la console.


Serveurs Call Of Duty 2 El!teMoD et Call of duty 4 : http://team-elite.fr

Hors ligne

#9 Le 14/10/2008, à 08:13

deax_one

Re : [Résolu] Création collaborative d'un "ls inversé"

merci pour l'info du sl cheuveulu, je vais changer mon nom d'alias car j'ai vu passer le p'tit train et que c'est fort divertissant...

Pour info, l'alias avait priorité sur le train.


Merci aussi à toi mobidyc pour cette info sur l'activation de l'option extglob, ça me permet d'utiliser "ls !(*toto*)" ou "ls !(*toto*|aaa*)"...

Toutefois, par fainéantise au clavier et par envie, je cherche toujours à pouvoir faire un alias-fonction.
Aujourd'hui, les solutions apportés ne fonctionnent pas pour moi,
donc je continue...

Si vous avez d'autres idées...


Jabber : mat@jabber.lutix.org
[img]http://lutix.org/images/mini_lutix.png[/img]

Hors ligne

#10 Le 14/10/2008, à 17:38

mobidyc

Re : [Résolu] Création collaborative d'un "ls inversé"

Hello,

rien de trop compliqué, et ça tiens en une ligne pour ton ~.profile:

sls() {(shopt -s extglob; ls !(*${*}*));}

pour les tests:

$> sls() {(shopt -s extglob; ls !(*${*}*));}
$> touch toto0{0..3}{0..9} aaa{0..9} aaa10 test{a..z}
$> ls
aaa0   aaa3  aaa7   testb  testf  testj  testn  testr  testv  testz    toto003  toto007  toto011  toto015  toto019  toto023  toto027  toto031  toto035  toto039
aaa1   aaa4  aaa8   testc  testg  testk  testo  tests  testw  toto000  toto004  toto008  toto012  toto016  toto020  toto024  toto028  toto032  toto036
aaa10  aaa5  aaa9   testd  testh  testl  testp  testt  testx  toto001  toto005  toto009  toto013  toto017  toto021  toto025  toto029  toto033  toto037
aaa2   aaa6  testa  teste  testi  testm  testq  testu  testy  toto002  toto006  toto010  toto014  toto018  toto022  toto026  toto030  toto034  toto038
$> sls toto
aaa0  aaa10  aaa3  aaa5  aaa7  aaa9   testb  testd  testf  testh  testj  testl  testn  testp  testr  testt  testv  testx  testz
aaa1  aaa2   aaa4  aaa6  aaa8  testa  testc  teste  testg  testi  testk  testm  testo  testq  tests  testu  testw  testy
$> sls "toto*|*aaa"
testa  testc  teste  testg  testi  testk  testm  testo  testq  tests  testu  testw  testy
testb  testd  testf  testh  testj  testl  testn  testp  testr  testt  testv  testx  testz

la seule complication se trouve dans les arguments à donner à ta fonction, en effet, si tu veux rechercher avec plusieurs filtres il faut mettre tes filtres entre double quotes (à cause du pipe) et il ne faut pas oublier les asterix pour un filtre global: "toto*|*tata"

de rien wink

cdt,
Mobidyc

Hors ligne

#11 Le 30/10/2008, à 13:44

deax_one

Re : [Résolu] Création collaborative d'un "ls inversé"

Désolé,

je n'avais pas vu cette réponse,

merci à tous
et merci à toi mobidyc
qui semble avoir donné l'alias-fonction le plus satisfaisant.

Je mets un résolu, même si je cherche encore des alternatives pour éviter les doubles quotes big_smile


Jabber : mat@jabber.lutix.org
[img]http://lutix.org/images/mini_lutix.png[/img]

Hors ligne

#12 Le 30/10/2008, à 13:57

deax_one

Re : [Résolu] Création collaborative d'un "ls inversé"

Nouvelle version! big_smile

Alors, je peux éviter les doubles quotes, par contre, il me faut autre chose que "*" comme caractère joker...

J'ai donc ajouté

shopt -s extglob

dans mon .bashrc

ainsi que ma fonction:

function sls() # lister sauf arguments
{
liste_excep="!("

for i in "$@"
do
	liste_excep="$liste_excep""$i""|"
done

liste_excep=`echo "$liste_excep" | rev | cut -b 2- | rev`
liste_excep="$liste_excep"")"
liste_excep=`echo "$liste_excep" | sed "s/-/*/g"`

ls $liste_excep
}

qui s'utilise donc comme suit:

sls -aaa- toto- -log

pour lister sauf les fichiers
- contenant "aaa"
- commençant par "toto"
- finissant par "log"

Voilà.

Si quelqu'un a une idée pour conserver les * au lieu des -...

Dernière modification par deax_one (Le 30/10/2008, à 14:26)


Jabber : mat@jabber.lutix.org
[img]http://lutix.org/images/mini_lutix.png[/img]

Hors ligne