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 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. roll

Un peu d'aide de la part du forum serait super bien venue  smile

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. wink

Dernière modification par kastopidiak (Le 15/01/2025, à 13:45)

En ligne

#4 Le 15/01/2025, à 15:28

Watael

Re : (résolu)D'une liste de fichiers, extraire ceux d'un type mime donné

cristobal78 a écrit :

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 ! hmm

le type mime d'un fichier est différent de son extension !

kastopidiak a écrit :
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/**

wink


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 ! smile

En 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.  smile

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é

cristobal78 a écrit :

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)

En 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.

En 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.  smile smile smile

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. smile

J'aurai quand même bien aimé  tongue  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