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 27/01/2022, à 14:52

cristobal78

(résolu)chercher fichiers du home dont le nom comporte des blancs

Bonjour à tous

je cherche une commande simple et sure à 100% pour trouver :
- dans le home
- exclusivement dans les dossiers NON cachés
- tous les fichiers dont le nom comporte AU MOINS un espace (ou blanc)

Pour cela j'ai écrit ceci :

 find  $HOME -name '.*'  -prune  -o  -type f  -name  "* *"  -print

Je me suis inspiré de bout de code pondu par d'autres et je ne comprends pas tout de cette commande, notamment le -print qui semble ici nécessaire mais pour quoi car la commande

 find  $HOME -name 'zzz*'

fonctionne elle sans -print

J'ai testé ma Cde et elle semble marcher mais il y a peut être des "trous dans la raquette" !!

Dernière modification par cristobal78 (Le 21/03/2022, à 01:33)


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#2 Le 27/01/2022, à 16:37

kamaris

Re : (résolu)chercher fichiers du home dont le nom comporte des blancs

Je pense qu'il n'y a pas de trou dans la raquette smile
Il faut spécifier -print dans la deuxième partie pour que cette action ne soit pas appliquée par défaut aussi à la première :

man find a écrit :

       The  -print  action  is performed on all files for which the whole expression is true, unless it contains an action other than -prune or -quit.  Actions which inhibit the default -print are -delete,
       -exec, -execdir, -ok, -okdir, -fls, -fprint, -fprintf, -ls, -print and -printf.

Tu peux rajouter un -type d dans la première partie, et si tu veux les fichiers qui contiennent un blanc au lieu d'une espace, tu peux mettre -name  "*[[:blank:]]*", donc au final :

find "$HOME" -type d -name '.*' -prune -o -type f -name "*[[:blank:]]*" -print

Remarque : il y a un piège si on exécute cette commande dans le répertoire courant désigné par « . » ou laissé vide, à la place de "$HOME" big_smile

Dernière modification par kamaris (Le 27/01/2022, à 16:38)

Hors ligne

#3 Le 27/01/2022, à 23:12

Tawal

Re : (résolu)chercher fichiers du home dont le nom comporte des blancs

Hello,

Pour éviter le "piège" (changer le -name '.*' en -name '.?*' :

find . -type d -name '.?*' -prune -o -type f -name "*[[:blank:]]*" -print

Non ?

Dernière modification par Tawal (Le 27/01/2022, à 23:13)


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

#4 Le 27/01/2022, à 23:39

kamaris

Re : (résolu)chercher fichiers du home dont le nom comporte des blancs

Oui c'est une possibilité, qui ne devrait pas avoir d'effet de bord je pense.
Tout à l'heure j'avais pensé à ajouter -mindepth 1 sinon.
Et on peut aussi forcer un chemin de répertoire absolu en mettant "$PWD".

Hors ligne

#5 Le 28/01/2022, à 01:48

cristobal78

Re : (résolu)chercher fichiers du home dont le nom comporte des blancs

salut kamaris

Merci de ta réponse.

"... un blanc au lieu d'un espace ??? ..."

Dans mon esprit un "blanc" dans un nom de fichier est obtenu par un appui sur la barre d'espacement (en bas du clavier) mais peut être que je me trompe de définition d'autant que de mémoire il existe aussi la notion d'espace insécable avec Alt -255
Autrement dit il y aurait un espace "blanc" ou un espace "insécable" ???
Au final je ne suis plus sûr de rien ! roll

Pourrais tu clarifier les différences entre  "espace" , "blanc" ou :blank: dans un nom de fichier ?
Et que prend en compte ma ligne de commande : des blancs, des espaces des espaces insécables ...?


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#6 Le 28/01/2022, à 05:52

MicP

Re : (résolu)chercher fichiers du home dont le nom comporte des blancs

Bonjour

Dans les pages du manuel de la commande find
il est indiqué que :

man find a écrit :
…
Les expressions rationnelles comprises par find sont, par défaut, celles d'Emacs (excepté que « . » correspond avec retour ligne).
…

Bon, d'aaaaccord…, alors on va dire que parfois,
je préfère aller directement lire les pages man dans leur langue originale,
ce qui donne :

LANG=C man find a écrit :
… The regular expressions understood by find are by default Emacs Regular Expressions (except that `.' matches newline). 

Et dans la documentation d'Emacs, on peut lire :

https://www.gnu.org/software/emacs/manual/html_node/elisp/Char-Classes.html a écrit :
‘[:blank:]’ This matches horizontal whitespace, as defined by Annex C of the Unicode Technical Standard #18.
            In particular, it matches spaces, tabs, and other characters whose Unicode ‘general-category’ property (see Character Properties) indicates they are spacing separators. 

ce qui nous renvoie vers :

https://www.unicode.org/reports/tr44/#White_Space a écrit :
White_Space  :  Spaces, separator characters and other control characters which should be treated by programming languages as "white space" for the purpose of parsing elements.
                See also Line_Break, Grapheme_Cluster_Break, Sentence_Break, and Word_Break, which classify space characters and related controls somewhat differently for particular text segmentation contexts.

Donc, par défaut, dans une commande find
la classe de caractères [:blank:] correspond aux caractères espace ou/et tabulation
et tout ce qui pourrait être considéré comme un whitespace <=> tout ce qui pourrait être considéré comme un séparateur de mots par un parser

Dernière modification par MicP (Le 28/01/2022, à 07:08)

Hors ligne

#7 Le 28/01/2022, à 11:38

Watael

Re : (résolu)chercher fichiers du home dont le nom comporte des blancs

notez qu'ici, [:blank:] n'est pas une regex : ça fait partie du Développement des chemins du shell.

c'est un point commun (et de confusion) entre les regex et la Correspondance de motifs (Pattern matching) du shell.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#8 Le 28/01/2022, à 12:36

MicP

Re : (résolu)chercher fichiers du home dont le nom comporte des blancs

@Watael

Ok,

Donc, si j'ai bien compris, j'étais hors sujet
car mon précédent message ne concernait que le cas d'une regex
qui aurait suivit l'option -regex (et ses dérivées) dans la commande find ?

… et dans le cas de la ligne de commande suivante :

find "$HOME" -type d -name '.*' -prune -o -type f -name "*[[:blank:]]*" -print

il ne s'agit pas d'une regex qui sera interprétée par la commande find
mais d'un motif qui sera interprété par le shell

Dernière modification par MicP (Le 28/01/2022, à 12:40)

Hors ligne

#9 Le 28/01/2022, à 14:38

Watael

Re : (résolu)chercher fichiers du home dont le nom comporte des blancs

Donc, si j'ai bien compris, j'étais hors sujet

il faut simplement bien indiquer quel option est utilisée.

il ne s'agit pas d'une regex qui sera interprétée par la commande find
mais d'un motif qui sera interprété par le shell

ce sera interprété par le shell si il n'y a pas de de protections (guillemets, ou apostrophes); et ça peut être problématique, parce qu'il faut que ce soit find qui interprète le motif indiqué*.

--
* à moins de savoir pourquoi ! wink
mais il doit n'y avoir que peu de raisons de le faire.

Dernière modification par Watael (Le 28/01/2022, à 14:38)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#10 Le 28/01/2022, à 15:20

MicP

Re : (résolu)chercher fichiers du home dont le nom comporte des blancs

OK, je pensais, après avoir lu ton message,
que pour que find interprète le motif comme une regex,
même en entourant ce motif par des apostrophes => 'motif'
il fallait quand même spécifier juste avant le motif qu'il s'agit d'une option de type regex

…mais je viens de comprendre que ce n'était pas indispensable
du moment où, en entourant le motif par des apostrophes,
on a empêché le shell de l'interpréter comme un pattern matching avant qu'il ne lance la ligne de commande qu'il aurait pré-interprétée.
et dans ce cas, le shell lancera la commande find sans avoir pré-interprété le motif
et ce sera à find d'interpréter le motif comme il l'entend.

Hors ligne

#11 Le 28/01/2022, à 16:47

cristobal78

Re : (résolu)chercher fichiers du home dont le nom comporte des blancs

Kamaris, MicP et Watael pour ma petite commande ... j'apprécie, j'adore !! smile smile smile

Pour info j'ai fait la manip suivante :
Dans LOWriter j'ai écrit ces deux mots  : espace insecable ( pas d'accent aigu sur le "e", on ne sait jamais !) .
Quant à l'espace entre les deux mots je l'ai obtenu avec Ctrl-Maj-Barre d'espacement.

Ensuite, dans un terminal, avec la cde touch j'ai créé un fichier nommé "espace insecable" en recopiant ces caractères de LOwriter vers le terminal :

touch espace insecable

L'espace insecable obtenu avec Writer n'a pas perturbé la cde touch car un seul fichier a bien été créé sous le nom "espace insecable".

J'ai mis ce fichier dans mon dossier Documents.
Enfin j'ai lancé ma commande du post #1 et elle n'a pas trouvé le fichier espace insecable alors qu'elle a trouvé d'autre fichiers (du dossier Documents) dans lesquels j'avais introduit des "blanc" dans leurs noms.

Que faut il en déduire ?


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#12 Le 28/01/2022, à 20:14

kamaris

Re : (résolu)chercher fichiers du home dont le nom comporte des blancs

cristobal78 a écrit :

Pourrais tu clarifier les différences entre  "espace" , "blanc" ou :blank: dans un nom de fichier ?

En fait je pensais que tu demandais toi-même une généralisation de la notion d'espace dans ta requête initiale, en écrivant « un espace (ou blanc) », c'est pourquoi je suis parti là-dedans.
Mais manifestement tu n'entendais par là qu'un synonyme big_smile

Alors voici la réponse : par « blanc », on entend généralement une généralisation de l'espace (obtenu en appuyant une fois sur la touche espace) à une certaine classe de caractères, qui peut dépendre de la locale.
La classe POSIX [:blank:] ne contient que l'espace et la tabulation.
Il y a aussi la classe [:space:], qui contient plus de choses, notamment le saut de ligne.
Voir par exemple cette question : https://unix.stackexchange.com/question … -and-space

Concernant la discussion ci-dessus à propos des regex, attention : le filtre -name ne fonctionne pas en regex, mais en « shell pattern » :

man find a écrit :

-name pattern
    Base of file name (the path with the leading directories removed) matches shell pattern pattern. […] The metacharacters (‘*’, ‘?’, and ‘[]’) match a ‘.’ at the start of the base name (this is a change in findutils-4.2.2; see section STANDARDS CONFORMANCE below).

Donc en gros comme bash avec l'option dotglob, et on peut trouver dans man bash une liste des classes de caractères supportées :

man bash a écrit :

Within [ and ], character classes can be specified using the syntax [:class:], where class is one of the following classes defined in the POSIX standard:
alnum alpha ascii blank cntrl digit graph lower print punct space upper word xdigit

Dernière modification par kamaris (Le 28/01/2022, à 20:15)

Hors ligne

#13 Le 28/01/2022, à 20:23

gigiair

Re : (résolu)chercher fichiers du home dont le nom comporte des blancs

Le caractère espace insécable que tu produis avec LO est le caractère 160= #xA0 (aka NO-BREAK SPACE) qui n'a rien à voir avec le carctère 32 =#x20 (aka SPACE) . Il n'y a strictement aucune raison que ta commande qui détecte ce dernier caractère trouve le premier.
Si tu veux trouver les noms qui contiennent le caractère SPACE ou le caractère NO-BREAK SPACE, tu peux utiliser une regex et placer tous les caractères recherchés entre crochets. Par exemple

 find . -maxdepth 1  -regex ".+[  ].+"

Entre les crochets tu tapes le caractère SPACE (barre d'espacement) et le caractère NO-BREAK SPACE (Alt gr barre d'espacement). C'est comme ça chez moi sous Xfce, mais je n'ai pas expérimenté dans d'autres environnements.

Dernière modification par gigiair (Le 28/01/2022, à 21:05)


--
JJR.

Hors ligne

#14 Le 28/01/2022, à 20:47

kamaris

Re : (résolu)chercher fichiers du home dont le nom comporte des blancs

Là aussi, les regex ne sont pas nécessaires.
Il est possible d'ajouter l'espace insécable à la liste des « blancs » dans la commande donnée plus haut :

find "$HOME" -type d -name '.*' -prune -o -type f -name '*['$'\xc2\xa0''[:blank:]]*' -print

Certes, il ne faut pas s'embrouiller dans les guillemets smile

Hors ligne

#15 Le 29/01/2022, à 00:51

cristobal78

Re : (résolu)chercher fichiers du home dont le nom comporte des blancs

merci  aussi à gigiair

Dans les noms de fichiers que je peux être amené à télécharger (mes fichiers n'ont jamais de blanc/espace/tabulation/ ... dans leur nom) il n'y a que des "appuis sur barre d'espace" car ce sont par exemple des nom de vidéos prises sur des sites quelconque, avec des titres genre "accidents de voiture les plus spectaculaires".

Il est quasi certain (99,99%) que les espaces entre les mots constituant le titre sont de simples appuis sur la barre d'espace.
Donc ma commande devrait suffire comme le disait Kamaris au post #2 qui rappelait au passage de mettre "$HOME" plutôt que $HOME


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#16 Le 29/01/2022, à 09:02

iznobe

Re : (résolu)chercher fichiers du home dont le nom comporte des blancs

cristobal78 a écrit :

Dans les noms de fichiers que je peux être amené à télécharger (mes fichiers n'ont jamais de blanc/espace/tabulation/ ... dans leur nom) il n'y a que des "appuis sur barre d'espace" car ce sont par exemple des nom de vidéos prises sur des sites quelconque, avec des titres genre "accidents de voiture les plus spectaculaires".

Il est quasi certain (99,99%) que les espaces entre les mots constituant le titre sont de simples appuis sur la barre d'espace.

Bonjour , je vois mal comment on peut faire la difference visuellement , ni comment etre sur que ce sont de "veritables espaces" plutot que des tab ou des espaces insecables ou autre .
Malheureusement on ne peut etre certain de rien justement , meme si dans la pratique il y a une forte probabilité que ce soit effectivement de " veritables espaces" .

Dernière modification par iznobe (Le 29/01/2022, à 09:03)


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#17 Le 29/01/2022, à 15:21

gigiair

Re : (résolu)chercher fichiers du home dont le nom comporte des blancs

iznobe a écrit :

Bonjour , je vois mal comment on peut faire la différence visuellement , ni comment être sûr que ce sont de "véritables espaces" plutôt que des tab ou des espaces insécables ou autre .
Malheureusement on ne peut être certain de rien justement , même si dans la pratique il y a une forte probabilité que ce soit effectivement de " véritables espaces" .

Il suffit d'utiliser un logiciel approprié.
Avec Emacs, en mode dired il suffit de placer le point (curseur) sur le caractère à identifier, puis de taper C-x =. Le code du caractère apparaît dans la ligne d'état. Si l'on tape C-u C-x = on a en plus tout un descriptif du caractère, dont le nom.
Avec le mode wdired, l'édition de la liste des fichier d'un répertoire se fait en pleine page, on peut utiliser toutes les fonctions d'un éditeur donc recherche et remplacement, y compris en utilisant des expressions régulières.
Il y a certainement d'autres outils qu'Emacs pour faire ça, mais Emacs est un véritable couteau suisse pour administrer une machine.


--
JJR.

Hors ligne