logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

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

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

#1 28-03-2022 17:43:23

Haricophile
Adhérent(e)
Lieu : Pignans (Var)
Distrib. : SID
Noyau : 4.0.0-1-amd64
(G)UI : Mate / i3 selon...
Inscription : 14-09-2009

assainir les noms de fichiers pour Windows

Bonjour,

Je veux pouvoir transférer de manière transparente un ensemble de fichier sur une machine Windows ou Android. Il y a bien detox, mais c'est pour le web et une arme de destruction massive pour mon usage a moin que quelqu'un sait le faite marcher sans détruire les caractères non-latin.

Je résume :

Les caractères problématiques :
~~~~~~~~~~~~~~~~~~~~~~~~

< (less than)
> (greater than)
: (colon)
" (double quote)
' (simple quote, c'est mieux sans)
/ (forward slash)
\ (backslash)
| (vertical bar or pipe)
? (question mark)
* (asterisk)
retour chariot
tabulation

autres règles :
~~~~~~~~~~
pas de « »au début du nom
pas de « . » ou de « » à la fin du nom
pas de retour de ligne ou de tabulation
supporte les espaces dans le nom
autorise les alphabets non latins (cyrillique…)
remplace un caractère non désiré par un _ ou une espace
.... et idéalement il faut gérer les «doublons» avec un conflits de casse (ajout d'un n° ?)
.... et tout a coup je pense aux noms de fichiers excessivement longs, itou ?

Est-ce que quelqu'un sait faire ça ou connaît un outil qui va m'éviter de réinventer la roue ?

P.S. Ce qu'il y a d'extraordinaire avec Windows c'est que le système NTFS supporte plus de choses que Windows sait gérer, ce qui peut être très fun avec un disque externe utilisé depuis Linux...

Dernière modification par Haricophile (28-03-2022 17:48:36)


« Un optimiste n’est pas un être satisfait, content de la situation actuelle. C’est quelqu’un qui pense qu’il peut faire quelque chose qui servira. » (Raymond Aubrac)

Hors ligne

#2 28-03-2022 21:13:01

vv222
Administrateur
Lieu : Bretagne
Distrib. : Debian Sid
(G)UI : sway
Inscription : 18-11-2013
Site Web

Re : assainir les noms de fichiers pour Windows

Quand je dois renommer des fichiers en masse, je passe en général par find et rename. rename fonctionne avec des expressions régulières, très similaires à celles qu’on utilise avec sed par exemple.

Un exemple de commande que j’utilise assez souvent pour retirer certains caractères des noms de tous les fichiers d’une arborescence donnée :

find . -exec rename "s/[,'’\!\?«»]//g" {} +


Jouer sous Debian ? Facile !

Ceterum censeo Barum esse delendam

Hors ligne

#3 29-03-2022 02:35:32

Haricophile
Adhérent(e)
Lieu : Pignans (Var)
Distrib. : SID
Noyau : 4.0.0-1-amd64
(G)UI : Mate / i3 selon...
Inscription : 14-09-2009

Re : assainir les noms de fichiers pour Windows

Je crois que je vais finir dans ce genre là effectivement, ça va demander plusieurs lignes de commandes pour faire ce que je veux. Il va falloir que je m'entraine sur les regex...

En tout cas merci

Dernière modification par Haricophile (29-03-2022 02:35:50)


« Un optimiste n’est pas un être satisfait, content de la situation actuelle. C’est quelqu’un qui pense qu’il peut faire quelque chose qui servira. » (Raymond Aubrac)

Hors ligne

#4 29-03-2022 06:42:24

TyZef
Membre
Lieu : Clan d'Eau.
Distrib. : ~ Debian 12 noDE ~ inspired by nakeDeb ~
Noyau : Linux 6.1.0-18-amd64
(G)UI : OB3
Inscription : 09-05-2013

Re : assainir les noms de fichiers pour Windows

tient, si vous me permettez?

moi aussi j'ai galèré avec des fichiers windows, lors de la copy de windows à linux, avec les "espace" dans les titres de fichiers windows, à la copy sur linux ça bloque..... un classique je suppose? on fait comment dans ce cas? le fameux " \ " à renommer partout? ou ce n'est peut être plus d'actualité?

désolé, vous allez peut être m'inviter à ouvrir un post pour ça, c'est juste par curiosité en fait, car je n'ai plus d'OS windows à présent...

« De deux choses lune, l’autre c’est le soleil » - Barbara Prévert.

Hors ligne

#5 29-03-2022 14:27:59

Tawal
Membre
Distrib. : Debian Stable à jour
Noyau : amd64
(G)UI : Xfce
Inscription : 25-02-2021

Re : assainir les noms de fichiers pour Windows

Hello,

En mélangeant bien les légumes du #1 et les aromates du #2, on obtient une soupe du genre :

find /chemin/du/dossier -exec rename "s/[\"*:<>?\\\|\r\t']//g" '{}' \+



Edit:
Ajout du légume apostrophe (qui n'apparaît pas en test)
et simplification de la regex.

Ce qui donne en test :

$ ls -l Doss_test
total 0
-rw-r--r-- 1 tawal tawal    0 29 mars  15:20  a:a
-rw-r--r-- 1 tawal tawal    0 29 mars  15:20 'b<b'
-rw-r--r-- 1 tawal tawal    0 29 mars  15:20 'c>c'
-rw-r--r-- 1 tawal tawal    0 29 mars  15:20 'e"e'
-rw-r--r-- 1 tawal tawal    0 29 mars  15:20 'f\f'
-rw-r--r-- 1 tawal tawal    0 29 mars  15:20 'g|g'
-rw-r--r-- 1 tawal tawal    0 29 mars  15:20 'h?h'
-rw-r--r-- 1 tawal tawal    0 29 mars  15:20 'j*j'
-rw-r--r-- 1 tawal tawal    0 29 mars  15:22 'r'$'\r''r'
-rw-r--r-- 1 tawal tawal    0 29 mars  15:24 't'$'\t''t'
$
$ find Doss_test -exec rename "s/[\"\*\:\<\>\?\\\|\r\t]//g" '{}' \+
$
$ ls -l Doss_test
-rw-r--r-- 1 tawal tawal 0 29 mars  15:24 aa
-rw-r--r-- 1 tawal tawal 0 29 mars  15:24 bb
-rw-r--r-- 1 tawal tawal 0 29 mars  15:24 cc
-rw-r--r-- 1 tawal tawal 0 29 mars  15:24 ee
-rw-r--r-- 1 tawal tawal 0 29 mars  15:24 ff
-rw-r--r-- 1 tawal tawal 0 29 mars  15:24 gg
-rw-r--r-- 1 tawal tawal 0 29 mars  15:24 hh
-rw-r--r-- 1 tawal tawal 0 29 mars  15:24 jj
-rw-r--r-- 1 tawal tawal 0 29 mars  15:24 rr
-rw-r--r-- 1 tawal tawal 0 29 mars  15:24 tt
$




Edit2:
Pour les autres règles (sauf la gestion des doublons indépendamment de la casse) :

find /chemin/du/dossier -exec rename "s/[\"*:<>?\\\|\r\t']/_/g; s/\/\s\s*/\/_/g; s/(\.| )(\.| )*$/_/g" '{}' \+


Tous caractères non voulus est remplacé par un _ (même tous espace en début de nom, ainsi que le point ou espace en fin de nom)
Pour le gestion des doublons je ne vois guère que passer par un script. Mais du coup cette commande est presque obsolète.
Bref, nouveau test :

$ ls -l Doss_test
total 0
-rw-r--r-- 1 tawal tawal 0 29 mars  15:57  a:a
-rw-r--r-- 1 tawal tawal 0 29 mars  15:57 'b<b'
-rw-r--r-- 1 tawal tawal 0 29 mars  15:57 'c>c'
-rw-r--r-- 1 tawal tawal 0 29 mars  15:57 'e"e'
-rw-r--r-- 1 tawal tawal 0 29 mars  15:57 'f\f'
-rw-r--r-- 1 tawal tawal 0 29 mars  15:57  gfg....
-rw-r--r-- 1 tawal tawal 0 29 mars  15:57 'g|g'
-rw-r--r-- 1 tawal tawal 0 29 mars  15:57 'h?h'
-rw-r--r-- 1 tawal tawal 0 29 mars  15:57 'ityiiy   '
-rw-r--r-- 1 tawal tawal 0 29 mars  15:57 'j*j'
-rw-r--r-- 1 tawal tawal 0 29 mars  15:57 'o '
-rw-r--r-- 1 tawal tawal 0 29 mars  15:57  pp.
-rw-r--r-- 1 tawal tawal 0 29 mars  15:57 'r'$'\r''r'
-rw-r--r-- 1 tawal tawal 0 29 mars  15:57 't'$'\t''t'
-rw-r--r-- 1 tawal tawal 0 29 mars  15:57 "z'z"
-rw-r--r-- 1 tawal tawal 0 29 mars  15:57 ' oo'
-rw-r--r-- 1 tawal tawal 0 29 mars  15:57 '    khjhjh. . '
$
$ find Doss_test -exec rename "s/[\"*:<>?\\\|\r\t']/_/g; s/\/\s\s*/\/_/g; s/(\.| )(\.| )*$/_/g" '{}' \+
$
$ ls - Doss_test
total 0
-rw-r--r-- 1 tawal tawal 0 29 mars  16:06 a_a
-rw-r--r-- 1 tawal tawal 0 29 mars  16:06 b_b
-rw-r--r-- 1 tawal tawal 0 29 mars  16:06 c_c
-rw-r--r-- 1 tawal tawal 0 29 mars  16:06 e_e
-rw-r--r-- 1 tawal tawal 0 29 mars  16:06 f_f
-rw-r--r-- 1 tawal tawal 0 29 mars  16:06 gfg_
-rw-r--r-- 1 tawal tawal 0 29 mars  16:06 g_g
-rw-r--r-- 1 tawal tawal 0 29 mars  16:06 h_h
-rw-r--r-- 1 tawal tawal 0 29 mars  16:06 ityiiy_
-rw-r--r-- 1 tawal tawal 0 29 mars  16:06 j_j
-rw-r--r-- 1 tawal tawal 0 29 mars  16:06 o_
-rw-r--r-- 1 tawal tawal 0 29 mars  16:06 pp_
-rw-r--r-- 1 tawal tawal 0 29 mars  16:06 r_r
-rw-r--r-- 1 tawal tawal 0 29 mars  16:06 t_t
-rw-r--r-- 1 tawal tawal 0 29 mars  16:06 z_z
-rw-r--r-- 1 tawal tawal 0 29 mars  16:06 _khjhjh_
-rw-r--r-- 1 tawal tawal 0 29 mars  16:06 _oo
$


Ou en ne changeant que le premier et dernier caractères non voulus (tout en traitant le reste du nom) avec :

find /chemin/du/dossier -exec rename "s/[\"*:<>?\\\|\r\t']/_/g; s/\/\s/\/_/g; s/(\.| )$/_/g" '{}' \+


Ce qui donne en résultat avec les même fichiers du test précédent :

$ find Doss_test -exec rename "s/[\"*:<>?\\\|\r\t']/_/g; s/\/\s/\/_/g; s/(\.| )$/_/g" '{}' \+
total 0
-rw-r--r-- 1 tawal tawal 0 29 mars  16:14  a_a
-rw-r--r-- 1 tawal tawal 0 29 mars  16:14  b_b
-rw-r--r-- 1 tawal tawal 0 29 mars  16:14  c_c
-rw-r--r-- 1 tawal tawal 0 29 mars  16:14  e_e
-rw-r--r-- 1 tawal tawal 0 29 mars  16:14  f_f
-rw-r--r-- 1 tawal tawal 0 29 mars  16:14  gfg..._
-rw-r--r-- 1 tawal tawal 0 29 mars  16:14  g_g
-rw-r--r-- 1 tawal tawal 0 29 mars  16:14  h_h
-rw-r--r-- 1 tawal tawal 0 29 mars  16:14 'ityiiy  _'
-rw-r--r-- 1 tawal tawal 0 29 mars  16:14  j_j
-rw-r--r-- 1 tawal tawal 0 29 mars  16:14  o_
-rw-r--r-- 1 tawal tawal 0 29 mars  16:14  pp_
-rw-r--r-- 1 tawal tawal 0 29 mars  16:14  r_r
-rw-r--r-- 1 tawal tawal 0 29 mars  16:14  t_t
-rw-r--r-- 1 tawal tawal 0 29 mars  16:14  z_z
-rw-r--r-- 1 tawal tawal 0 29 mars  16:14  _oo
-rw-r--r-- 1 tawal tawal 0 29 mars  16:14 '_   khjhjh. ._'

Dernière modification par Tawal (29-03-2022 15:20:02)


Comme la science n'est pas infuse, elle se diffuse.
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

Pied de page des forums