Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comportement de ls

9 réponses
Avatar
dominique
Bonsoir,
Comme je n'ai pas d'imprimante, « j'imprime » mes documents en .ps puis
je les passe à ps2pdf14. Tout fonctionne bien.
Par fainéantise, je ne mets pas toujours l'extension .ps.
Mon répertoire, après ps2pdf14, me donne ceci :

[normal@localhost Temp]$ ls -l
total 14840
-rw-rw-r-- 1 normal normal 285119 nov 25 20:33 bellanger
-rw-rw-r-- 1 normal normal 29077 nov 25 20:33 bellanger.pdf
-rw-rw-r-- 1 normal normal 286260 nov 25 20:32 isolba
-rw-rw-r-- 1 normal normal 29483 nov 25 20:32 isolba.pdf
-rw-rw-r-- 1 normal normal 14527243 nov 16 07:27 UR054g.zip

Je cherche à isoler les fichiers sans extension. man ls m'indique
l'option -I motif.
Je fais donc ls -laI *.* afin d'ignorer les fichiers qui ont un point
dans leur nom. Mais le résultat n'est pas celui attendu :

[normal@localhost Temp]$ ls -laI *.*
-rw-rw-r-- 1 normal normal 29483 nov 25 20:32 isolba.pdf
-rw-rw-r-- 1 normal normal 14527243 nov 16 07:27 UR054g.zip

Curieusement, j'obtiens des fichiers avec un point mais pas tous...
Je dois me tromper avec le motif. Quelle serait la bonne solution pour
n'afficher que les fichiers sans extension ?
Question subsidiaire, comment utiliser rm pour n'effacer que ces
fichiers sans extension ?
Je peux certes le faire fichier par fichier ou les lier avec ls
bellanger isolba... mébon...

Merci et bonne soirée,
Dominique

9 réponses

Avatar
Nicolas George
dominique wrote in message <45689f5e$0$25921$:
[ Temp]$ ls -laI *.*


Le *.* est développé par le shell, et c'est la liste des fichiers résultante
qui est passée à ls.

Question subsidiaire, comment utiliser rm pour n'effacer que ces
fichiers sans extension ?


chsh -s /bin/zsh
exec zsh
setopt extendedglob
rm *~*.*

Avatar
lhabert
Nicolas George :

dominique wrote in message <45689f5e$0$25921$:
[ Temp]$ ls -laI *.*


Le *.* est développé par le shell, et c'est la liste des fichiers résultante
qui est passée à ls.


Et donc il faut protéger le « *.* » de la sorte :

ls -laI '*.*'

Question subsidiaire, comment utiliser rm pour n'effacer que ces
fichiers sans extension ?



for f in *; do case $f in *.*) ;; *) rm -- "$f";; esac; done

find . -maxdepth 1 '!' -name '*.*' -print0 | xargs -0 rm


Avatar
dominique
dominique wrote in message <45689f5e$0$25921$:
[ Temp]$ ls -laI *.*


Le *.* est développé par le shell, et c'est la liste des fichiers résultante
qui est passée à ls.


Logiquement, la liste ne devrait pas retenir les fichiers avec un point
grâce à -I, non ?



Question subsidiaire, comment utiliser rm pour n'effacer que ces
fichiers sans extension ?


chsh -s /bin/zsh


Changement de shell

exec zsh


?

setopt extendedglob
rm *~*.*


Est-ce que tu pourrais m'expliquer ces lignes ? Je ne connais pas du
tout zsh. De toutes les manières, il n'est apparemment pas installé...
Merci et bonne soirée,
Dominique


Avatar
lhabert
dominique :

dominique wrote in message <45689f5e$0$25921$:
[ Temp]$ ls -laI *.*


Le *.* est développé par le shell, et c'est la liste des fichiers résultante
qui est passée à ls.


Logiquement, la liste ne devrait pas retenir les fichiers avec un point
grâce à -I, non ?


On reprend :
- tu tapes la commande

ls -laI *.*

- le shell la découpe en trois éléments :
ls
-laI
*.*

- je saute quelques étapes qui n'ont pas d'importance ici.

- pour chaque élément, le shell regarde si il contient des étoiles (et
d'autres caractères spéciaux), et si oui, remplace cet élément par la liste
des fichiers qui matchent ce motif. Tu te retrouves donc avec :

ls
-laI
bellanger.pdf
isolba.pdf
UR054g.zip

- enfin, le shell exécute ls, avec les éléments suivants de la liste en
argument. ls voit donc que le motif que tu lui demandes d'éviter est
« bellanger.pdf », puis il voit deux arguments « isoalba.pdf » et
« UR05g.zip », qu'il t'affiche tous les deux puis qu'il y a bien des
fichiers portant ces noms, et que ce ne sont pas des répertoires (dans ce
cas, il t'afficherait leur contenu).



Avatar
dominique

- le shell la découpe en trois éléments :
ls
-laI
*.*

- je saute quelques étapes qui n'ont pas d'importance ici.

- pour chaque élément, le shell regarde si il contient des étoiles (et
d'autres caractères spéciaux), et si oui, remplace cet élément par la liste
des fichiers qui matchent ce motif. Tu te retrouves donc avec :

ls
-laI
bellanger.pdf
isolba.pdf
UR054g.zip

- enfin, le shell exécute ls, avec les éléments suivants de la liste en
argument. ls voit donc que le motif que tu lui demandes d'éviter est
« bellanger.pdf », puis il voit deux arguments « isoalba.pdf » et
« UR05g.zip », qu'il t'affiche tous les deux puis qu'il y a bien des
fichiers portant ces noms, et que ce ne sont pas des répertoires (dans ce
cas, il t'afficherait leur contenu).


J'ai, du shell, une vision prismée, pur enfant du basic que je suis
(premières lignes de code sur un Sharp PC 1211 vers 1982) et premières
lignes en GWbasic en 1986...
Pourquoi, très précisément, si je demande d'exclure les fichiers avec un
point, le shell ne m'affiche que ceux-là ? En ce cas, il m'aurait suffit
de taper :
ls *.*
Et pourquoi j'ai la bonne réponse en protégeant mon motif '*.*'
Les expressions régulières me causent bien des soucis... et ce n'est pas
faute de me dire souvent : « Allez, ce coup-ci, je comprends... »
Dominique,
qui a sans doute la comprenette un peu laborieuse...

Avatar
lhabert
dominique :

Pourquoi, très précisément, si je demande d'exclure les fichiers avec un
point, le shell ne m'affiche que ceux-là ?
Et pourquoi j'ai la bonne réponse en protégeant mon motif '*.*'


Le shell ne t'affiche rien du tout, et ce n'est pas à lui que tu demandes
d'exclure quoi que ce soit. Le shell, tu lui demandes de lancer ls avec les
arguments que tu donnes sur la ligne de commande, mais en expansant les
motifs non protégés suivant le mécanisme décrit dans mon message précédent.

Ensuite, l'exclusion, c'est au niveau de ls. C'est ls qui a une option
« -I », qui prend l'argument suivant comme un motif servant à exclure des
fichiers. Si tu protèges le motif, l'argument suivant va être « *.* ». ls se
met donc à afficher le contenu du répertoire courant (puisqu'il n'y a pas
d'argument indiquant quels fichiers ou répertoires afficher). Si tu ne
protèges pas le motif, comme je l'expliquait dans le message précédent, il
est remplacé par une liste de noms de fichiers, le premier de ces noms est
considéré par ls comme un motif à exclure, et les suivants comme des noms de
fichiers à afficher.

Avatar
dominique
dominique :

Pourquoi, très précisément, si je demande d'exclure les fichiers avec un
point, le shell ne m'affiche que ceux-là ?
Et pourquoi j'ai la bonne réponse en protégeant mon motif '*.*'


Le shell ne t'affiche rien du tout, et ce n'est pas à lui que tu demandes
d'exclure quoi que ce soit. Le shell, tu lui demandes de lancer ls avec les
arguments que tu donnes sur la ligne de commande, mais en expansant les
motifs non protégés suivant le mécanisme décrit dans mon message précédent.

Ensuite, l'exclusion, c'est au niveau de ls. C'est ls qui a une option
« -I », qui prend l'argument suivant comme un motif servant à exclure des
fichiers. Si tu protèges le motif, l'argument suivant va être « *.* ». ls se
met donc à afficher le contenu du répertoire courant (puisqu'il n'y a pas
d'argument indiquant quels fichiers ou répertoires afficher). Si tu ne
protèges pas le motif, comme je l'expliquait dans le message précédent, il
est remplacé par une liste de noms de fichiers, le premier de ces noms est
considéré par ls comme un motif à exclure, et les suivants comme des noms de
fichiers à afficher.


Ça y est ! J'ai compris !
Enfin, non, pas de trop.
J'ai fait touch sur test et essai avec ou sans extension.
J'ai ça comme résultat :
[ Temp]$ ls -l
total 14252
-rw-rw-r-- 1 normal normal 37422 nov 26 11:03 Conseil_2006.html
-rw-rw-r-- 1 normal normal 0 nov 26 16:46 essai
-rw-rw-r-- 1 normal normal 0 nov 26 16:46 essai.txt
drwxrwxr-x 10 normal normal 4096 nov 25 21:50 mplayerplug-in
-rw-rw-r-- 1 normal normal 0 nov 26 16:46 test
-rw-rw-r-- 1 normal normal 0 nov 26 16:45 test.txt
-rw-rw-r-- 1 normal normal 14527243 nov 16 07:27 UR054g.zip

J'indique une exclusion :
[ Temp]$ ls -lI *.*
-rw-rw-r-- 1 normal normal 0 nov 26 16:46 essai.txt
-rw-rw-r-- 1 normal normal 0 nov 26 16:45 test.txt
-rw-rw-r-- 1 normal normal 14527243 nov 16 07:27 UR054g.zip

Tous les fichiers sans extension sont exclus ainsi que le premier
fichier avec .html. Ce n'est pas vraiment ce que j'attendais.

Je protège mon motif :
[ Temp]$ ls -lI '*.*'
total 4
-rw-rw-r-- 1 normal normal 0 nov 26 16:46 essai
drwxrwxr-x 10 normal normal 4096 nov 25 21:50 mplayerplug-in
-rw-rw-r-- 1 normal normal 0 nov 26 16:46 test

J'ai la réponse attendue. C'est le comportement du motif non protégé que
je comprends vraiment mal. La réponse est l'inverse de ce que j'attends
en moins complète que :

[ Temp]$ ls -l *.*
-rw-rw-r-- 1 normal normal 37422 nov 26 11:03 Conseil_2006.html
-rw-rw-r-- 1 normal normal 0 nov 26 16:46 essai.txt
-rw-rw-r-- 1 normal normal 0 nov 26 16:45 test.txt
-rw-rw-r-- 1 normal normal 14527243 nov 16 07:27 UR054g.zip

Ou alors, ls lit le flux d'information et exclue le premier fichier de
la liste (comportement normal de -I) puis ls affiche les fichiers qui
répondent au motif *.*

Je crois que ça y est, je pige :
[ Temp]$ touch aessai
[ Temp]$ touch aessai.txt
[ Temp]$ ls -l
total 14252
-rw-rw-r-- 1 normal normal 0 nov 26 16:54 aessai
-rw-rw-r-- 1 normal normal 0 nov 26 16:54 aessai.txt
-rw-rw-r-- 1 normal normal 37422 nov 26 11:03 Conseil_2006.html
-rw-rw-r-- 1 normal normal 0 nov 26 16:46 essai
-rw-rw-r-- 1 normal normal 0 nov 26 16:46 essai.txt
drwxrwxr-x 10 normal normal 4096 nov 25 21:50 mplayerplug-in
-rw-rw-r-- 1 normal normal 0 nov 26 16:46 test
-rw-rw-r-- 1 normal normal 0 nov 26 16:45 test.txt
-rw-rw-r-- 1 normal normal 14527243 nov 16 07:27 UR054g.zip

Là, j'ai le contenu de mon répertoire.

[ Temp]$ ls -lI *.*
-rw-rw-r-- 1 normal normal 37422 nov 26 11:03 Conseil_2006.html
-rw-rw-r-- 1 normal normal 0 nov 26 16:46 essai.txt
-rw-rw-r-- 1 normal normal 0 nov 26 16:45 test.txt
-rw-rw-r-- 1 normal normal 14527243 nov 16 07:27 UR054g.zip

Et là, finalement, je ne comprends pas pourquoi mon fichier aessai.txt
n'apparaît pas ! Il répond pourtant bien au motif *.* !

Dominique


Avatar
lhabert
Désolé, je ne vois pas comment t'expliquer autrement que je ne l'ai déjà
fait. Essaye de relire mes messages, et de déduire avec quels arguments ls
est vraiment lancé dans les cas que tu indiques.
Avatar
dominique
Désolé, je ne vois pas comment t'expliquer autrement que je ne l'ai déjà
fait. Essaye de relire mes messages, et de déduire avec quels arguments ls
est vraiment lancé dans les cas que tu indiques.


Je te remercie. Je vais attendre un jour un peu plus éclairé pour
comprendre :-)
Je me souviens déjà qu'il faut protéger le motif pour que ls -I réponde
à la question posée. J'ai déjà une partie de la solution.
Bonne soirée,
Dominique