IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

[Débutant]Script pour lister certains type de fichiers, et envoyer la taille globale dans un fichier txt


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Octobre 2018
    Messages : 8
    Par défaut [Débutant]Script pour lister certains type de fichiers, et envoyer la taille globale dans un fichier txt
    Bonjour à tous,
    je me permet de m'inscrire sur ce forum, après l'avoir parcouru ( et ne pas avoir trouvé la réponse, sauf erreur), afin d'obtenir de l'aide sur la réalisation d'un petit script qui me permettrait de scanner un poste utilisateur de mon réseau ( j'y suis admin, of course ) et afficher un résultat anonyme ( pas besoin de l'emplacement du fichier, ni du propriétaire) avec uniquement un global.
    Je ne suis probablement pas très clair, je décris un exemple :

    Dans le cadre de contrôle prévus, je dois scanner l'ensemble du SI afin de quantifier l'espace disque pris par des fichiers de type précis, disons *.type1 *.type2 et *.type3, je souhaite obtenir ensuite un fichier resultat.txt dans lequel apparaîtrait des lignes *.type1 xGo / *.type2 yGo / *type3 zMo

    Je tente diverses combinaisons simples autour de find et ls, mais n'ai rien obtenu de satisfaisant, pensez vous possible de faire un petit script simple pour arriver à ce résultat ?

    Merci par avance de votre aide
    Cordialement

  2. #2
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Octobre 2018
    Messages : 8
    Par défaut
    j'ai trouvé quand même une piste, que j'explore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "Total fichiers \".txt\": $(( $(find . -type f -iname "*.txt" -printf '+%s') ))"
    mais il me manque l'incrémentation du fichier resultat.txt avec type de fichier 1 / taille totale suivi du type 2, 3 etc que je puisse ensuite reprendre simplement avec un calc pour sortir le tableau rapidement et propre

  3. #3
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Octobre 2018
    Messages : 8
    Par défaut
    Aller, encore en progrès, mais très rustique, je pense : en prenant l'exemple d'un fichier odt.. Reste à encore augmenter le tout par chaque type de fichier que je veux ajouter et trouver comment aller à la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf "odt " > odt.txt |find . -type f -iname "µ.odt" -exec du -h -c {} + | tail -1 >> odt.txt

  4. #4
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 292
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     find / -type f -iregex ".*\.\(mp4\|webm\|mpg\|avi\)" -printf '%s\t\t%p\n' 2>/dev/null
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     find / -type f -iregex ".*\.\(mp4\|webm\|mpg\|avi\)" -printf '%s\t\t%p\n' 2>/dev/null |awk '{total+=$1;} END{print total;}'

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Pour un total par extension :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -type f -iregex '.*\.\(mp4\|webm\|mpg\|avi\)$' -printf '%f %k\n' | awk '{gsub(/^.*\./, "", $1);S[tolower($1)]+=$2} END{for (X in S){print X " : " S[X] " k"}}'
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 263
    Par défaut
    Autre approche :
    Cela affichera le total des fichiers de l'extension.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  7. #7
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    "bizarre" confirmé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # find . -iname '*.odt' -exec du -cb {} +
    0	./simul_pdm4file1/bidon with space.odt
    34177	./recap_rsync.odt
    195363	./analyse rsync output.odt
    189971	./multisorties_rsync.odt
    419511	total

  8. #8
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 292
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find / -type f -printf "%f\t%k\n" 2>/dev/null |sed '/\./s/[^.]*\t/\t&/;/\./!s/\t/\t\t/' | awk -F'\t' '{a[$2]+=$3;} END{for (ex in a) print ex";"a[ex];}' | sort -t';' +1n | awk -F';' 'BEGIN{e[0]="ko";e[1]="Mo";e[2]="Go";e[3]="To";e[4]="Po";} {lvl=0;q=$2;while (q>=1024) {lvl++;q=int(q/1024);} print q""e[lvl]"\t"(($1=="")?"Sans extension":"*."$1);}' |tee ~/Documents/taille_par_extension.txt |tail -n20

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    t'as pas trouvé plus compliqué ?
    quel est le gain ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Bonsoir,

    que j'utilise la ligne de al1_24 à peine modifiée à la fin car je fais tourner ça dans un dossier où il n'y a que 3 petits fichiers .odt et donc je transforme {printf "%s %d Mo\n", X, (S[X]/1024)} en {printf "%s %d ko\n", X, (S[X])}, ou que j'utilise la ligne de chrtophe (en enlevant le "s" de tail !) + l'adaptation de N_BaH, soit find . -name "*.odt" -exec du -chs {} +|tail -n1|cut -f 1, dans les deux cas je récupère 416 ko.

    Or mes trois fichiers totalisent 419.6 ko :
    Nom : 3_fic_odt.png
Affichages : 144
Taille : 10,1 Ko

    Il est où, le blème ? Car c'est un coup à faire échouer une sauvegarde, ça, si on calcule mal l'espace nécessaire :
    clic droit / propriétés des 3 fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          195 363
          189 971
           34 177
    total 419 511
    Pour arriver à ce total, la ligne d'al1_24 doit être un poil modifiée ainsi : -printf '%f:%k\n' --> -printf '%f:%s\n', mais je ne vois pas trop comment modifier le mix chrtophe-N_BaH...

  11. #11
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find ... -print0 | xargs -0 -- du --total --bytes
    Citation Envoyé par man du
    -b, --bytes equivalent to '--apparent-size --block-size=1'
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Excellent !

    Et pour donc n'avoir que la valeur du total,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # find . -name "*.odt" -print0 | xargs -0 -- du --total --bytes |tail -n1|cut -f 1
    419511
    L'autre ligne fonctionne aussi (à partir du moment où on le sait, ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # find . -name "*.odt" -exec du --total --bytes {} + |tail -n1|cut -f 1
    419511
    Peut-être un poil plus lisible ?

    EDIT :
    Citation Envoyé par al1_24 Voir le message
    Si tu as des noms de fichiers ou de répertoires qui comportent des espaces, ça complique un peu le travail en effet.
    Je n'ai pas eu cette impression : j'ai exactement le même résultat, dans un dossier de test, si je renomme un des fichiers avec des espaces, et idem avec un sous-dossier.

    Donc en gros, si on veut récupérer les tailles de plusieurs types de fichiers, je me contente de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # find . -type f -iregex '.*\.\(pdf\|odt\|ods\)$' -exec du --total --bytes {} + |tail -n1|cut -f 1

  13. #13
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 263
    Par défaut
    -exec echo -n... ?
    tu voulais dire -print0 | xargs -0 ..., autant dire -exec du -chs {} +.
    Ca marche pas. Quand j'ai des noms de fichiers à espace, ça prend chaque morceau comme un argument.

    Le code que j'ai mis ne fonctionnera que pour chercher un seul type de fichiers les .odt dans l'exemple. Rien n'empêche de faire une boucle avec.

    Mais comme précisé, je ne maitrise pas le bash.

    La solution des regex n'est pas à bannir, mais peut-être compliqué à utiliser sauf à recopier le code fourni sans le comprendre.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  14. #14
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Octobre 2018
    Messages : 8
    Par défaut
    Je reconnais que côté compréhension, je me fait l’effet d’un galérien, mais morceaux par morceaux, avec l’aide du net et manpage je vais y arriver
    J’ai plein de pistes de travail, c’est top, l’idee étant de ne pas bêtement copier le code mais comprendre ce que je fais pour faire évoluer ce script ensuite plus loin, en particulier, effectivement dans un cadre de sécurité et sauvegarde des données

  15. #15
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    Ca marche pas. Quand j'ai des noms de fichiers à espace, ça prend chaque morceau comme un argument.
    ...
    La solution des regex n'est pas à bannir, mais peut-être compliqué à utiliser sauf à recopier le code fourni sans le comprendre.
    Ça fonctionne très bien avec la regex que j'ai citée, piquée à al1_24 (), avec ou sans espaces dans le nom de fichier comme dans le nom de sous-dossier.

    Et pas besoin de la comprendre dans ses tréfonds, on sait qu'elle ne va conserver que les fichiers dont l'extension est fournie (on peut en enlever ou en ajouter).

    Citation Envoyé par loic2707 Voir le message
    Je reconnais que côté compréhension, je me fais l’effet d’un galérien, mais morceaux par morceaux, avec l’aide du net et manpage je vais y arriver
    Et avec des tests, à n'en plus finir, en ne modifiant qu'un paramètre à la fois pour bien mesurer les différences.

    En réduisant la ligne, aussi, ça permet de bien voir et comprendre ce qu'elle fait, exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -type f -iregex '.*\.\(txt\|odt\)$'
    EDIT : arrivé pendant que je préparais ce qui précède :
    Citation Envoyé par ctac_ Voir le message
    Attention :
    Le iregex rate les fichiers rares dont le nom comporte un \n que iname ne rate pas :

    A-t-on idée, aussi, d'inclure des retours-chariot dans le nom d'un fichier ? Non mais, quel plan tordu

    Prenons donc bonne note de ta suggestion
    Merci,

  16. #16
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    Citation Envoyé par chrtophe
    Ca marche pas. Quand j'ai des noms de fichiers à espace, ça prend chaque morceau comme un argument.
    bizarre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ >mon\ test.wav
    $ find . -name "*.wav" -exec du -cb {} +
    [...]
    0       ./mon test.wav
    [...]
    473760844       total
    pareil avec xargs -0.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  17. #17
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Par défaut
    Bonjour,

    Citation Envoyé par Jipété Voir le message
    Donc en gros, si on veut récupérer les tailles de plusieurs types de fichiers, je me contente de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # find . -type f -iregex '.*\.\(pdf\|odt\|ods\)$' -exec du --total --bytes {} + |tail -n1|cut -f 1
    Attention :
    Le iregex rate les fichiers rares dont le nom comporte un \n que iname ne rate pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # find . -type f \( -iname '*.pdf' -o -iname '*.odt' -o -iname '*.ods' \) -exec du --total --bytes {} + |tail -n1|cut -f 1
    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/06/2017, 11h26
  2. un script pour Lister, Modifier, remplacer des noms de fichiers pour un upload?
    Par shadock0 dans le forum Shell et commandes POSIX
    Réponses: 2
    Dernier message: 27/09/2011, 21h47
  3. Réponses: 0
    Dernier message: 03/02/2011, 12h15
  4. [PowerShell] Script pour lister date des dernières modifications apportée à un fichier
    Par Thoms13 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 16/03/2010, 12h39
  5. script pour lister les fichier
    Par deathness dans le forum Linux
    Réponses: 3
    Dernier message: 05/10/2008, 10h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo