#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é"
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
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
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!
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