#1 Le 15/01/2025, à 12:03
- cristobal78
(résolu)D'une liste de fichiers, extraire ceux d'un type mime donné
Bonjour à tous
Voulant obtenir une liste de tous les fichiers non cachés d'un PC j'ai lancé cette commande :
ls -lR /home/$USER/* | grep -v "drwx" | grep "rwx" > listefichier
ls -lR /home/$USER/* | grep -v "drwx" | grep "rwx" | wc -l
19433
Question 1 : ai je bien trouvé TOUS les fichiers (non cachés) ?
De cette liste nommée "listefichier" de 19433 lignes je voudrais extraire et afficher tous les fichiers LibreOffice de type "writer" ou "calc" ET dont le nom ne comporte PAS l'extension .odt ou .ods
Note : Les fichiers du pc ne comportent que des lettres et des chiffres, des tirest (signe moins) ou des underscore, jamais d'espace.
J'ai bien pensé à la commande "find" mais il semble qu'elle ne sache pas reconnaitre le mime-type en tout cas j'ai eu beau regarder le man sur find et je n'ai pas trouvé.
Question 2 : vrai ou faux ???
Alors pourquoi pas une boucle de type "for in / do / done" et tester ligne par ligne le type mime de chaque fichier mais ça me parait un peu dingue parce qu'il y a 19433 lignes et en plus je ne sais pas trop comment le faire.
Un peu d'aide de la part du forum serait super bien venue
Dernière modification par cristobal78 (Le 16/01/2025, à 20:07)
Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE
Hors ligne
#2 Le 15/01/2025, à 13:40
- Tawal
Re : (résolu)D'une liste de fichiers, extraire ceux d'un type mime donné
Hello.
1ère chose on ne ls pas dans un script.
Ensuite, pour lister des fichiers autant utiliser find qui est fait pour ça.
Puis tu peux utiliser file sur chaque fichier pour obtenir leur type mime.
Une commande typique :
find /répertoire -type f ! -name ".*" -exec bash -c '[[ $(file -bi "$1") =~ writer|calc ]] && [[ ! $1 =~ .od(t|s)$ ]] && echo "$1"' _ {} \;
Dernière modification par Tawal (Le 15/01/2025, à 13:42)
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#3 Le 15/01/2025, à 13:41
- kastopidiak
Re : (résolu)D'une liste de fichiers, extraire ceux d'un type mime donné
Bonjour,
Je ne comprend pas vraiment tes commandes. Par défaut ls affiche tous les fichiers sauf ceux dont le nom commence par un point (cachés).
Si tu veux afficher tous les fichiers, récursivement, qui ne sont pas des répertoires :
ls -lR /home/$USER/* | grep ^-
Le problème c'est que tu perd l’emplacement complet, tu n'as que les noms de fichiers.
À mon avis il faut utiliser find et file pour connaître le type MIME.
Par exemple :
find /home/$USER -not -path '*/.*' -type f -exec file --mime-type {} \;
on cherche tous les fihiers dans /home/$USER dont le nom ne commence pas par un point et dont le type est fichier et on affiche leur nom et type MIME.
On doit pouvoir aussi faire comme ceci :
shopt -s globstar
for fichier in /home/$USER/**/*
do
if [ -f "$fichier" ]; then
file --mime-type "$fichier"
fi
done
Je ne sais pas ce qui est le plus rapide.
EDIT : réponse en même temps que la précédente. Entre les deux tu as tous les éléments pour ton script.
Dernière modification par kastopidiak (Le 15/01/2025, à 13:45)
Hors ligne
#4 Le 15/01/2025, à 15:28
- Watael
Re : (résolu)D'une liste de fichiers, extraire ceux d'un type mime donné
19433 lignes
19433 lignes, ce ne sont pas forcément 19433 noms de fichiers; pour me le rappeler, j'ai toujours un fichier nommé
mon
fait
chier
1 fichier -> trois lignes !
le type mime d'un fichier est différent de son extension !
shopt -s globstar for fichier in /home/$USER/**/*
je faisais ça aussi, et puis on m'a fait remarquer que la dernière partie du chemin est inutile :
shopt -s globstar
for fichier in /home/$USER/**
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 15/01/2025, à 17:05
- kastopidiak
Re : (résolu)D'une liste de fichiers, extraire ceux d'un type mime donné
Ah oui ! Cela a l'air de donner le même résultat. Merci !
Hors ligne
#6 Le 15/01/2025, à 17:27
- cristobal78
Re : (résolu)D'une liste de fichiers, extraire ceux d'un type mime donné
merci de vos réponses.
Pour kastopidiak
Comme j'utilise la commande je remonte bien les fichiers (non cachés), puis avec grep -v "drwx" je supprime les répertoires et enfin j'élimine les sous totaux en ne conservant que les lignes qui commecent par rwx
J'obtiens 19433 lignes
Avec ta commande adaptée
moi@ldlc15pjcc:~$ ls -lR /home/$USER/* | grep ^- | wc -l
19467
moi@ldlc15pjcc:~$
soit 34 lignes de plus.
Coment s'explique cet écart ?
Pour Tawal
"1ère chose on ne ls pas dans un script."
J'ai déjà lu cette remarque mais si les noms de fichiers ne contiennent pas d'espaces (blancs) dans leur noms cela ne devrait pas provoquer de problème ???
J'ai essayé ta commande adaptée comme suit :
find /home/$USER -type f ! -name ".*" -exec bash -c '[[ $(file -bi "$1") =~ writer|calc ]] && [[ ! $1 =~ .od(t|s)$ ]] && echo "$1"' _ {} \;
mais elle ne veut pas fonctionner car une fois lancée elle semble attendre quelquechose : le prompt ne revient pas.
Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE
Hors ligne
#7 Le 15/01/2025, à 17:35
- Tawal
Re : (résolu)D'une liste de fichiers, extraire ceux d'un type mime donné
La commande que j'ai donnée et que tu as bien adaptée renvoie les fichiers ayant un mime-type "writer" ou "calc" et sans extension odt/ods.
Tant qu'elle ne trouve pas un fichier correspondant à ces critères, rien ne s'affiche.
Laisse la tourner.
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#8 Le 15/01/2025, à 17:56
- Watael
Re : (résolu)D'une liste de fichiers, extraire ceux d'un type mime donné
on n'utilise ls pas dans un script
même
si les noms de fichiers ne contiennent pas d'espaces
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 15/01/2025, à 18:13
- kastopidiak
Re : (résolu)D'une liste de fichiers, extraire ceux d'un type mime donné
Comme j'utilise la commande je remonte bien les fichiers (non cachés), puis avec grep -v "drwx" je supprime les répertoires et enfin j'élimine les sous totaux en ne conservant que les lignes qui commecent par rwx
Non pour la dernière partie tu n'affiches que les fichiers qui ont des permission rwx, ceux qui ont des permission rw (ce qui devrait être le cas de la très grande majorité) ou autres sont éliminés. Note bien qu c'est le même problème pour le premier filtrage avec grep, tous tes dossiers n'ont pas forcément des permission rwx.
Cela ne se produit pas avec ma commande qui en plus évite un grep inutile.
Dernière modification par kastopidiak (Le 15/01/2025, à 18:14)
Hors ligne
#10 Le 16/01/2025, à 00:31
- cristobal78
Re : (résolu)D'une liste de fichiers, extraire ceux d'un type mime donné
@ tawal post # 7
j'ai suivi ton conseil et laissé tourner pendant 2 mn 30 sec pour -enfin- récupérer le prompt. Tu avais raison il faut laisser tourner !!
Pour info la commande n'a rien trouvé.
L'ennui c'est qu'elle aurait dû trouver au moins un fichier, celui que j'avais créé juste avant, un fichie LO Calc sans extension .ods dans son nom.
Ta ligne de dommande ne contiendrait-elle pas une petite erreur ?
En effet si je fais un file -bi sur un des fichiers clairement de type LibreOffice Calc, avec son extension .ods, le retour de la commande est :
application/vnd.oasis.opendocument.spreadsheet; charset=binary
On ne voit ni le mot writer ni le mot calc
C'est ce qui me fait penser que cette partie de ta commande :
.... [[ $(file -bi "$1") =~ writer|calc ]] ....
n'est pas correcte.
@ watael
" on n'utilise ls pas dans un script même si les noms de fichiers ne contiennent pas d'espaces"
j'ai bien compris ce que tu dis mais ce n'est pas une explication.
Que risque-t-on à utiliser un ls quand aucun fichier ne comporte d'espace dans son nom ???
Dernière modification par cristobal78 (Le 16/01/2025, à 00:42)
Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE
Hors ligne
#11 Le 16/01/2025, à 00:57
- Watael
Re : (résolu)D'une liste de fichiers, extraire ceux d'un type mime donné
il y a plein de mauvaises raisons de vouloir parcourir la sortie de ls, elles démontrent toutes une mauvaise connaissance du shell, et des commandes de bases.
ne pas utiliser ls dans un script est une question de bonne habitude : je n'ai plus besoin d'enquêter sur le format des noms des fichiers que je traite/rai.
selon ce que j'ai à faire, je boucle sur le chemin, ou sur find -print0. Ce sont des méthodes sûres dans 100% des cas.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#12 Le 16/01/2025, à 08:07
- kastopidiak
Re : (résolu)D'une liste de fichiers, extraire ceux d'un type mime donné
shopt -s globstar
for fichier in /home/$USER/**
do
info_fichier=$(file --mime-type "$fichier")
if [[ "$info_fichier" =~ "vnd.oasis.opendocument" ]]; then
echo "$info_fichier"
fi
done
On peut faire plus court ou plus compact mais j'ai essayé d'être lisible.
Hors ligne
#13 Le 16/01/2025, à 09:30
- Tawal
Re : (résolu)D'une liste de fichiers, extraire ceux d'un type mime donné
Je ne connais pas les mime-types des fichiers LibreOffice.
Je me suis basé sur tes informations.
Donc le bon mime-type à chercher serait : vnd.oasis.opendocument
Ensuite, c'est normal que la commande prenne du temps, elle scrute toute l'arborescence de ton Home.
Il serait judicieux d'affiner les recherches dans des répertoires plus spécifiques.
find permet de donner plusieurs répertoires dans lesquels chercher, par exemple :
find ~/Documents ~/Images ...
De plus, il peut être aussi intéressant de ne pas scruter les répertoires cachés avec l'option -path :
find "$HOME" ! -path "*/.*" ...
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#14 Le 16/01/2025, à 20:06
- cristobal78
Re : (résolu)D'une liste de fichiers, extraire ceux d'un type mime donné
Merci tawal, et aux autres bien sur.
La commande devient :
find /home/$USER -type f ! -name ".*" -exec bash -c '[[ $(file -bi "$1") =~ vnd.oasis.opendocument ]] && [[ ! $1 =~ .od(t|s)$ ]] && echo "$1"' _ {} \;
et ça marche.
J'aurai quand même bien aimé qu'on me montre sur un exemple le danger qu'il y a à utiliser le retour d'une commande ls même si les noms de fichiers ne comporte ni espaces ni caractères bizarres.
Je passe en résolu.
Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE
Hors ligne
#15 Le 16/01/2025, à 20:37
- Watael
Re : (résolu)D'une liste de fichiers, extraire ceux d'un type mime donné
ce n'est pas parce qu'il n'y a pas de danger immédiat qu'il ne faut pas prendre de précautions.
c'est aussi pour ça que, même au milieu de la nuit, on préfère marcher sur le trottoir (à moins de vouloir futilement frissonner).
Dernière modification par Watael (Le 16/01/2025, à 20:38)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne