Comportement de ls
Le
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
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

Poser une question


Le *.* est développé par le shell, et c'est la liste des fichiers résultante
qui est passée à ls.
chsh -s /bin/zsh
exec zsh
setopt extendedglob
rm *~*.*
Et donc il faut protéger le « *.* » de la sorte :
ls -laI '*.*'
for f in *; do case $f in *.*) ;; *) rm -- "$f";; esac; done
find . -maxdepth 1 '!' -name '*.*' -print0 | xargs -0 rm
Logiquement, la liste ne devrait pas retenir les fichiers avec un point
grâce à -I, non ?
Changement de shell
?
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
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).
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...