Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#26 19-05-2020 07:15:14

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : [résolu] lister des fichiers dont le nom excède n caractères

enicar a écrit :

Pour m'amuser, j'ai essayé de refaire cela en Haskell.


Tu peux faire ça en scheme (guile par exemple) aussi ? smile

En perl, sans boucle et sans regexp :

perl -MFile::Basename -e 'print grep { length $_ > 103 } map { basename "$_\n" } glob "/media/musique_flac/*/*.flac"'

Dernière modification par Beta-Pictoris (19-05-2020 07:16:29)

Hors ligne

#27 19-05-2020 07:50:22

enicar
Membre
Lieu : ailleurs
Distrib. : sid
Noyau : 5.8.7
(G)UI : openbox
Inscription : 26-08-2010

Re : [résolu] lister des fichiers dont le nom excède n caractères

Beta-Pictoris a écrit :

Tu peux faire ça en scheme (guile par exemple) aussi ? smile



Justement, j'y pensais, je vais voir cela dans la journée smile

Hors ligne

#28 19-05-2020 07:52:36

enicar
Membre
Lieu : ailleurs
Distrib. : sid
Noyau : 5.8.7
(G)UI : openbox
Inscription : 26-08-2010

Re : [résolu] lister des fichiers dont le nom excède n caractères

Beta-Pictoris a écrit :

En perl, sans boucle et sans regexp :


Euh, en fait les boucles sont dans le map et le glob…

Hors ligne

#29 19-05-2020 08:54:09

debianux
Membre
Distrib. : debian-stretch-9.7_LVM-chiffré_dual-boot-uefi-w10
Noyau : Linux 4.9.0-8-amd64
(G)UI : Xfce 4.12
Inscription : 19-05-2014

Re : [résolu] lister des fichiers dont le nom excède n caractères

Bonjour MicP !

j'avais bien le 'done' : c'est mon copier-coller vers ici qui a fourché smile

j'avais également bien fait le chmod

mais j'avais bien oublié le './'

et là il est trouvé !
mais entre-temps, le find de Beta-Pictoris est passé dans les 'flac' : plus rien à trouver > 103..

donc j'ai testé sur 90, 80 et 50 car max : il n'en trouve aucun : bizarre.

cat script_flac_titreslongueur-sup-103car


#!/bin/bash
nbMax=50
for f in *.flac; do
    [ ${#f} -gt $nbMax ] && echo $f
done
 


./script_flac_titreslongueur-sup-103car > testlist.txt


cat testlist.txt


jlg@t460s:/media/musique_flac$
 



merci également pour l'astuce image iso pour épargner les dvd smile

Hors ligne

#30 19-05-2020 09:46:15

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : [résolu] lister des fichiers dont le nom excède n caractères

enicar a écrit :

Beta-Pictoris a écrit :

En perl, sans boucle et sans regexp :


Euh, en fait les boucles sont dans le map et le glob…


Sans boucle explicite. smile

Hors ligne

#31 19-05-2020 11:47:55

enicar
Membre
Lieu : ailleurs
Distrib. : sid
Noyau : 5.8.7
(G)UI : openbox
Inscription : 26-08-2010

Re : [résolu] lister des fichiers dont le nom excède n caractères

En guile, c'est assez facile :


;; usage: guile -e main FindLongName.scm [<dir1> [<dir2>…]]
(use-modules (ice-9 ftw)
             (ice-9 regex))

(define (printn s)
  (begin
    (display s)
    (newline)
    #t))

(define (display-fname filename statinfo flag)
  (if (eq? flag 'regular)
      (let ((f (basename filename)))
        (if (and (string-match "\\.flac$" f)
                 (> (string-length f) 103))
            (printn f)
            #t))
      #t))

(define (main arguments)
  (if (> (length arguments) 1)
      (for-each (lambda(dir) (ftw dir display-fname))
                (cdr arguments))
      (ftw "." display-fname)))
 


Je n'ai pas trouvé de fonction `glob'. Elle existe peut-être.
Je crois qu'il y en a une dans la slib, mais ça fait un moment
que la slib ne fonctionne plus avec guile.
Là j'utilise des modules qui font partie de la distribution standard
de guile. J'utilise guile-3.0. Il compile automatiquement les
programmes .scm. L'extension utilisée pour les fichiers compilés est
.go (!). Ce sont des fichiers ELF, qui ne sont pas exécutables
directement.
Question performance, j'ai trouvé cela assez rapide. Ce n'est pas étonnant,
car ça utilise la fonction ftw de la glibc.

Dernière modification par enicar (19-05-2020 11:49:43)

Hors ligne

#32 19-05-2020 12:34:06

enicar
Membre
Lieu : ailleurs
Distrib. : sid
Noyau : 5.8.7
(G)UI : openbox
Inscription : 26-08-2010

Re : [résolu] lister des fichiers dont le nom excède n caractères

@Beta-Pictoris
Bon, j'ai testé ton oneline en perl. Il ne parcours pas récursivement les répertoires.
Je ne sais plus comment on fait un parcours récursif avec des glob…
Le temps de regarder…
Dans bash il faut activer l'option globstar et utiliser **. Comme ça par exemple :


echo ./**/*.flac
 


Je n'ai pas l'impression que ça fonctionne en perl, en tout cas, pas comme ça neutral

Hors ligne

#33 19-05-2020 15:15:13

enicar
Membre
Lieu : ailleurs
Distrib. : sid
Noyau : 5.8.7
(G)UI : openbox
Inscription : 26-08-2010

Re : [résolu] lister des fichiers dont le nom excède n caractères

J'ai trouvé une autre solution en Haskell, qui utilise un glob avec un pattern récursif :


{-# LANGUAGE PackageImports #-}

module Main where

import "Glob" System.FilePath.Glob (glob)
import System.FilePath (takeFileName)
-- import System.Environment (getArgs)

main :: IO ()
main = do
  ls <- filter tooLong  <$> glob "**/*.flac"
  mapM_ putStrLn ls
  where
    tooLong = (>103) . length . takeFileName
 


Le {-# LANGUAGE PackageImports #-}, c'est juste parce
que j'utilise une extension qui me permet de spécifier le package
depuis lequel j'importe le module System.FilePath.Glob car
j'ai deux packages qui exportent ce module. Ici j'utilise le package
Glob. Ce module a une fonction glob qui permet de
rechercher un motif dans le répertoire courant. Le motif **
permet de faire un recherche récursive.

On peut aussi écrire le main sur une seule ligne, mais c'est plus
difficile à lire :


main = glob "**/*.flac" >>= mapM_ putStrLn . filter ((>103) . length . takeFileName)
 


Mais que veut dire ce « . » ? C'est la composition de fonctions.
Donc


length . takeFileName
 


va extraire le nom de fichier (takeFileName est équivalent de
basename), ensuite la fonction length est appliqué au résultat.
C'est comme si j'avais écrit :


longueurNomDeFichier path = length (takeFileName path)
 


Sauf que ça m'évite de donner un nom à la fonction.
(>103) est un prédicat qui vaut vrai si le nombre passé en
argument est stritement supérieur à 103 (comme on pouvait s'y attendre).
C'est une section. Ça évite d'utiliser une lambda expression ou
d'écrire une fonction avec un nom explicite pour l'occasion.
On pourrait l'écrire avec une lambda :


\n -> n > 103
 


ou avec un nom explicite :


plusGrandQue103 n = n > 103
 


mapM_ va appliquer la fonction putStrLn à chaque éléments de la liste
passé en arguments. C'est une fonction, pas une construction du
langage. Le truc ici c'est que mapM_ est une focntion qui attend 2
arguments (pour simplifier). Ici je l'utilise avec un seul argument,
ça crée une nouvelle fonction prendra une liste en argument.
C'est comme si j'avais défini une nouvelle fonction :


mapPutStrLn ls = mapM_ putStrLn ls
 


et que j'utilisais :


mapPutStrLn (filter)
 


Reste >>= que je vais laisser inexpliqué… (c'est la poudre de
perlinpinpin de Haskell wink)

Dernière modification par enicar (19-05-2020 15:18:29)

Hors ligne

#34 19-05-2020 17:00:45

enicar
Membre
Lieu : ailleurs
Distrib. : sid
Noyau : 5.8.7
(G)UI : openbox
Inscription : 26-08-2010

Re : [résolu] lister des fichiers dont le nom excède n caractères

Cette fois en une seule ligne de ruby :


ruby -e 'Dir.glob("**/*.flac").select {|f| File.basename(f).size > 103 }.each { |f| puts f }'
 


La ligne est un peu longue, peut-être qu'on peut faire plus court, mais bon
ça marche.

Dernière modification par enicar (19-05-2020 17:12:54)

Hors ligne

#35 19-05-2020 17:49:53

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : [résolu] lister des fichiers dont le nom excède n caractères

Avec guile, tu peux utiliser 'scandir' pour retourner la liste des fichiers , 'string-match' pour la correspondance regex et 'filter' pour filtrer.

#!/usr/bin/guile -s
!#

(use-modules (ice-9 regex))

(use-modules (ice-9 ftw))

(use-modules (ice-9 format))

(format #t "~{~a~%~}"
  (filter (lambda (s) (> (string-length s) 103)) (scandir "/media/musique_flac" (lambda (s) (not (boolean? (string-match "\\.flac$" s))))) )
)

Voir si ce script est correct.

Dernière modification par Beta-Pictoris (19-05-2020 17:59:12)

Hors ligne

#36 19-05-2020 18:01:54

enicar
Membre
Lieu : ailleurs
Distrib. : sid
Noyau : 5.8.7
(G)UI : openbox
Inscription : 26-08-2010

Re : [résolu] lister des fichiers dont le nom excède n caractères

@Beta-Pictoris
J'ai vu qu'il y avait scandir, mais j'ai préféré utiliser ftw car ça ne génère
pas une liste qui occupera de la mémoire. En haskell, je n'ai pas ce soucis
car les listes sont générées de manière fainéante (ce sont des streams).

Je ne sais pas si ça fonctionne, par contre c'est très mal mis en forme.
Et je trouve que c'est très important, la forme. La forme vaut le fond
assez souvent. Et là, ça ne donne pas envie de lire le code.
D'autant qu'un code ne tourne pas plus vite quand il y a moins de lignes big_smile

Hors ligne

#37 19-05-2020 18:10:12

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : [résolu] lister des fichiers dont le nom excède n caractères

C'est mieux comme ça ? smile

#!/usr/bin/guile -s
!#

(use-modules (ice-9 regex))

(use-modules (ice-9 ftw))

(use-modules (ice-9 format))

(format #t
  "~{~a~%~}"
  (filter (lambda (s) (> (string-length s) 103))
    (scandir "/media/musique_flac"
       (lambda (s) (not (boolean? (string-match "\\.flac$" s)
                )
            )
         )
       )
    )
  )


 

Dernière modification par Beta-Pictoris (19-05-2020 18:13:57)

Hors ligne

#38 19-05-2020 18:15:42

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : [résolu] lister des fichiers dont le nom excède n caractères

L'indention scheme du forum ne permet pas mieux.
Le code formaté dans emacs n'est pas parfaitement repris.

Hors ligne

#39 19-05-2020 18:22:41

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : [résolu] lister des fichiers dont le nom excède n caractères

Bon ! J'ai formaté avec vim en utilisant des tabulations : cool

#!/usr/bin/guile -s
!#

(use-modules (ice-9 regex))

(use-modules (ice-9 ftw))

(use-modules (ice-9 format))

(format #t
        "~{~a~%~}"
        (filter (lambda (s) (> (string-length s)
                               103))
                (scandir "/media/musique_flac"
                         (lambda (s) (not (boolean? (string-match "\\.flac$"
                                                                  s)
                                                    )
                                          )
                           )
                         )
                )
        )
 

Hors ligne

#40 19-05-2020 18:24:39

enicar
Membre
Lieu : ailleurs
Distrib. : sid
Noyau : 5.8.7
(G)UI : openbox
Inscription : 26-08-2010

Re : [résolu] lister des fichiers dont le nom excède n caractères

Beta-Pictoris a écrit :

L'indention scheme du forum ne permet pas mieux.
Le code formaté dans emacs n'est pas parfaitement repris.


Oui, j'ai remarqué aussi. J'utilise aussi emacs pour coder (mais avec evil
pour faire à la vim). J'utilise geiser pour gérer le scheme.

Beta-Pictoris a écrit :

C'est mieux comme ça ?


Oui bien mieux smile

J'aime bien les petites (voire les très petites) fonctions, du coup j'aurais fait comme ça :


(use-modules (ice-9 regex)
             (ice-9 ftw)
             (ice-9 format))


(define (too-long? s)
  (> (string-length s) 103))

(define (flac-file? s)
  (not (boolean? (string-match "\\.flac$" s))))


(format #t
        "~{~a~%~}"
        (filter too-long?
                (scandir "." flac-file?)))
 


Dans mon programme en scheme, je gère aussi les arguments de la cmdline.
J'attends une liste de répertoires ou rien.

Dernière modification par enicar (20-05-2020 20:45:27)

Hors ligne

#41 19-05-2020 18:33:55

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : [résolu] lister des fichiers dont le nom excède n caractères

Oui, j'avais les prédicats ecrits sous forme de fonction dans mon code d'origine.

J'ai préféré tout mettre sur une ligne, car je trouvais le code trop long.  tongue

Mais, il est vrai que c'est bien plus lisible comme tu as fait. cool

A noter, je termine les prédicats par un point d'interrogation.

Tu connais wisp ? : https://archive.fosdem.org/2019/schedul … m_2019.pdf

Dernière modification par Beta-Pictoris (19-05-2020 19:30:07)

Hors ligne

#42 19-05-2020 18:36:09

enicar
Membre
Lieu : ailleurs
Distrib. : sid
Noyau : 5.8.7
(G)UI : openbox
Inscription : 26-08-2010

Re : [résolu] lister des fichiers dont le nom excède n caractères

Hum, j'ai testé, le scandir ne fonctionne pas de cette façon.
Ça ne descend pas récursivement dans l'arborescence tel que
c'est écrit.
Dans mon programme guile, je fait bien attention de renvoyer un #t
quoiqu'il arrive, car au premier #f, ça s'arrête. Avec scandir, je ne sais
pas, il va falloir creuser…

Hors ligne

#43 19-05-2020 18:56:41

enicar
Membre
Lieu : ailleurs
Distrib. : sid
Noyau : 5.8.7
(G)UI : openbox
Inscription : 26-08-2010

Re : [résolu] lister des fichiers dont le nom excède n caractères

Beta-Pictoris a écrit :


Tu connais whisp ? : https://archive.fosdem.org/2019/schedul … m_2019.pdf


Non je connaissais pas, décidément lisp inspire encore des gens smile
Je ne sais pas les « : » et l'indentation sont mieux que les (…).
C'est sûr que ça fait plus clair comme syntaxe. À voir, si le layout
est aussi sensible qu'en python (un truc qui m'agace en python).

En haskell, le layout est plus libre, et ça marche très bien.
Dans la rubrique curiosité, j'ai vu cela Axel.  C'est une sorte de lisp
avec la sémantique de haskell…

Il existe un éditeur destiné au clojure qui parenthèse en fonction de
l'indentation : nightcode. Ça permet d'indenter comme en python
et l'éditeur mets les parenthèses à la bonne place.

Dans emacs, j'utilise smartparents et evil-cleverparens (un remake
d'une extension pour vim). Ça fait un beau formatage. Je n'ai
pratiquement rien à faire, les parenthèses se mettent toute seule par
paire, quand j'en ouvre une, la parenthèse fermante se met
automatiquement (ce qui n'est pas toujours idéal). Quand je tape
<return>, le code est directement bien indenté. Et aussi, j'utilise
rainbow-delimiters, ça permet d'avoir des couleurs différentes en
fonction du niveau de « parenthèsage » et de l'endroit où se trouve
le curseur.

Il n'empêche que du point de la syntaxe, je préfère haskell…

Dernière modification par enicar (19-05-2020 19:47:54)

Hors ligne

#44 19-05-2020 18:58:17

enicar
Membre
Lieu : ailleurs
Distrib. : sid
Noyau : 5.8.7
(G)UI : openbox
Inscription : 26-08-2010

Re : [résolu] lister des fichiers dont le nom excède n caractères

Beta-Pictoris a écrit :

A noter, je termine les prédicats par un point d'interrogation.


C'est ce que je faisais aussi, quand je faisais du scheme smile
C'est aussi l'usage en ruby.

Hors ligne

#45 19-05-2020 19:47:12

enicar
Membre
Lieu : ailleurs
Distrib. : sid
Noyau : 5.8.7
(G)UI : openbox
Inscription : 26-08-2010

Re : [résolu] lister des fichiers dont le nom excède n caractères

Alors, j'ai regardé, scandir (qui est basé sur la même fonction de la glibc) ne scanne
que le répertoire qu'on lui donne en argument. Il ne descend pas récursivement dans
l'arborescence. Ça ne pouvait pas faire ce à quoi je m'attendais.

Hors ligne

#46 19-05-2020 20:02:01

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : [résolu] lister des fichiers dont le nom excède n caractères

C'est comme la fonction glob de perl.

Hors ligne

#47 19-05-2020 20:07:53

enicar
Membre
Lieu : ailleurs
Distrib. : sid
Noyau : 5.8.7
(G)UI : openbox
Inscription : 26-08-2010

Re : [résolu] lister des fichiers dont le nom excède n caractères

Beta-Pictoris a écrit :

C'est comme la fonction glob de perl.


Oui, c'est curieux pour la fonction gob de perl. Je m'attendais à pouvoir
faire un parcours récursif avec. En Haskell, j'ai trois librairies qui proposent
une sorte de glob. Avec une, le parcours récursif ne fonctionne pas avec les glob ** ;
d'un autre côté cette lib (filemanip) propose une excellente interface pour utiliser
un find qui rend les glob ** peu utiles.

Hors ligne

#48 20-05-2020 19:49:23

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : [résolu] lister des fichiers dont le nom excède n caractères

enicar a écrit :


Dans emacs, j'utilise smartparents et evil-cleverparens (un remake
d'une extension pour vim).


As-tu eu l'occasion de comparer smartparents à paredit ?

Pour coder en guile sous emacs, le mode geiser permet d'accéder facilement à la doc (pages d'info). Tu ne l'utilises pas ?

Hors ligne

#49 20-05-2020 20:04:23

Beta-Pictoris
Membre
Lieu : Angers
Distrib. : Buster
Inscription : 11-08-2015

Re : [résolu] lister des fichiers dont le nom excède n caractères

enicar a écrit :

Beta-Pictoris a écrit :

C'est comme la fonction glob de perl.


Oui, c'est curieux pour la fonction gob de perl. Je m'attendais à pouvoir
faire un parcours récursif avec. En Haskell, j'ai trois librairies qui proposent
une sorte de glob. Avec une, le parcours récursif ne fonctionne pas avec les glob ** ;
d'un autre côté cette lib (filemanip) propose une excellente interface pour utiliser
un find qui rend les glob ** peu utiles.


En perl, il y a bien la fonction find du module File::Find, mais, à première vue, elle ne retourne rien.

Perl permet, par contre, de récupérer facilement le résultat des commandes shell sous forme liste/tableau, grâce aux backquotes :

perl -MFile::Basename -e 'print grep { length $_ > 103 } map { basename "$_\n" } `find "/media/musique_flac"`'

Dernière modification par Beta-Pictoris (20-05-2020 20:05:57)

Hors ligne

#50 20-05-2020 20:44:36

enicar
Membre
Lieu : ailleurs
Distrib. : sid
Noyau : 5.8.7
(G)UI : openbox
Inscription : 26-08-2010

Re : [résolu] lister des fichiers dont le nom excède n caractères

Beta-Pictoris a écrit :

As-tu eu l'occasion de comparer smartparents à paredit ?


Apparemment, paredit est beaucoup plus strict que smartparens. C'est à
dire que paredit insiste pour que les parenthèses soient bien
équilibrées. Aussi dans smartparens on peut rajouter des paires de
caractères. Je n'ai pas vraiment testé (ou alors je me souviens plus)
paredit. Par contre j'ai lu ça : Paredit and smartparens
À priori je préfère la façon de faire de smartparens que j'ai
découvert lorque j'ai utilisé spacemacs (c'est le choix par défaut).

Beta-Pictoris a écrit :

Pour coder en guile sous emacs, le mode geiser permet d'accéder facilement à la doc (pages d'info). Tu ne l'utilises pas ?


En fait je n'ai pas encore eu le temps d'explorer geiser, ça fait
vraiment pas longtemps que je l'ai installé et je ne fais pas souvent
du scheme wink A vrai dire, c'est l'occasion pour que je complète la
configuration de geiser smile

Hors ligne

Pied de page des forums