#1 Le 15/01/2023, à 10:48
- Hizoka
[Résolu] Vérifier l'existence d'un fichier quelle que soit la casse
Bonjour,
voici ma situation :
- J'ai un point de montage d'un disque ntfs partagé avec windows.
- J'ai une liste d'URL (au format windows que je convertis) qui pointe vers ces fichiers qui ne respectent pas franchement la casse.
- Dans un script php hébergé sur un Linux, j'ai besoin de travailler sur ces fichiers (au moins vérifier leur existence à minima).
- Lorsque la casse est respectée, tout fonctionne.
Le problème étant bien évidemment les fichiers dont la casse n'est pas respectée.
Avez vous une idée de comment vérifier qu'ils existent bien et mieux encore, récupérer la bonne url ?
Je parle bien d'adresse, pas de nom de fichier, le fichier peut être bien nommé mais pas celui d'un dossier parent.
Pour s'amuser, je précise qu'il y a plusieurs centaines de milliers de fichiers dans le disque donc on va éviter les boucles.
La seule solution que je vois pour le moment (mais qui me parait bien lourde) c'est de faire :
find point_montage -type f > ListeFichiers
grep -i URL ListeFichiers
Mais ça me parait lourd et surtout il faudra refaire souvent le find car le disque est très vivant.
Il y aurait aussi la solution folle de tester chaque url en modifiant chaque caractère entre upper et lower
Une idée d'une commande qui serait adaptée ?
Plus c'est simple, plus je pourrais l'incorporer dans mon php facilement
Merci et bon dimanche !
Dernière modification par bruno (Le 18/01/2023, à 16:51)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#2 Le 15/01/2023, à 12:12
- jplemoine
Re : [Résolu] Vérifier l'existence d'un fichier quelle que soit la casse
Je ne comprends pas l'utilité de la première ligne...
Un truc du genre :
grep -i URL point_montage
ne fonctionne pas ?
Ensuite il faut "jouer" avec les options de grep (notamment H au besoin)
2ème chose : c'est peut-être dans le mount du partage qu'il faut dire qu'il faut être case insensitive. (voir option nocase qui semble récente)
Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.
Déconnecté jusqu’à nouvel ordre
Hors ligne
#3 Le 15/01/2023, à 12:32
- Watael
Re : [Résolu] Vérifier l'existence d'un fichier quelle que soit la casse
salut,
c'est toi qui a écrit le script php ?
alors, pourquoi ne pas faire la vérification dans ce script ?
je ne fais pas de php, je vais donc botter en touche* : stfw "PHP check file exists case insensitive"
mais je ne comprends pas.
Comment la liste est-elle établie ? si c'est par une sorte de ls, comment la liste peut-elle ne pas correspondre à ce qu'il y a sur le disque ?
--
* très grossièrement :
- créer une liste des fichiers du disque
- if fichierListe.toLower is in listDisk.toLower; then ... ; else ...; endIf
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 15/01/2023, à 17:43
- k3c
Re : [Résolu] Vérifier l'existence d'un fichier quelle que soit la casse
si ton disque partage avec Windows est géré sous Linux, tu peux utiliser inotify
exemple, à la création de tout fichier dans une directory, on applique une action, par exemple ton traitement sur la casse
https://forum.ubuntu-fr.org/viewtopic.php?id=916501
Dernière modification par k3c (Le 15/01/2023, à 18:16)
Debian 12 sur Thinkpad reconditionné
Hors ligne
#5 Le 15/01/2023, à 19:40
- Hizoka
Re : [Résolu] Vérifier l'existence d'un fichier quelle que soit la casse
Bonsoir,
@jplemoine
J'ai pas compris ta proposition d'utiliser simplement grep pour rechercher un fichier...
J'ai pas trop la main pour le mount mais l'idée est pas mal en effet...
@Watael
Oui j'ai la main sur le php, mais je n'ai rien trouvé de probant lors de mes recherches, en effet en gros ils bouclent sur tous les fichiers et comparent les noms en minuscule...
Du coup, ça ne fonctionnerait pas si les noms de dossiers ne sont pas bons.
Un truc sans fin, d'où mon idée de passer en bash en me disant qu'il y avait peut être moyen de faire mieux...
La liste est une extraction de liens depuis une base de données d'un logiciel windows.
@k3c
Non, le disque est vraiment utilisé par windows, je me branche dessus pour réaliser des traitements.
J'ai l'impression que je vais devoir rester sur mon idée de base find + grep.
Ca va être chronophage mais fonctionnel.
Sauf si une idée surgit
Dernière modification par Hizoka (Le 15/01/2023, à 19:43)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#6 Le 15/01/2023, à 20:38
- k3c
Re : [Résolu] Vérifier l'existence d'un fichier quelle que soit la casse
tu as inotify pour Windows, plusieurs pistes
https://stackoverflow.com/questions/351 … on-windows
si tu as la main sur le Windows
Debian 12 sur Thinkpad reconditionné
Hors ligne
#7 Le 15/01/2023, à 21:00
- Hizoka
Re : [Résolu] Vérifier l'existence d'un fichier quelle que soit la casse
Pour le coup, je n'ai pas du tout la main sur le windows.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#8 Le 15/01/2023, à 21:46
- Watael
Re : [Résolu] Vérifier l'existence d'un fichier quelle que soit la casse
à mon avis, tu vas perdre plus de temps à le faire faire par bash qu'à trouver l'index de la correspondance de fichierListe.toLower avec un élément de listDisk.toLower.
parce que tu vas le faire en shell, mais c'est le php qui l'exécutera via un appel "system()", c'est ça ? beurk.
Dernière modification par Watael (Le 15/01/2023, à 21:47)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 15/01/2023, à 22:53
- Hizoka
Re : [Résolu] Vérifier l'existence d'un fichier quelle que soit la casse
L'idée serait de :
- lister les fichiers via un appel à find depuis le php ou depuis le shell avant l’exécution du php
- une boucle sur les url
> Si le fichier existe, comme d'hab, le tout en php
> S'il n'existe pas, je fais un appel à grep
Tu proposerais de se passer de grep en lisant le fichier ligne par ligne directement depuis php ?
J'ai peur de charger en mémoire un array à la place du fichier...
Pour info, ce système est très temporaire et ne devrait pas être utilisait plus de 2 ou 3 fois en vrai.
EDIT :
ChatGPT me propose :
function file_url_case_sensitive($file) {
$file = strtolower($file);
$files = glob('*');
$key = array_search($file, array_map('strtolower', $files));
if ($key !== false) {
return realpath($files[$key]);
} else {
return false;
}
}
Ca semble une bonne idée mais vu le nombre d'élément à charger dans $files puis dans l'array_map....
Je vais tester ça demain, je verrai bien ce qui fonctionne le mieux et je ferai un retour
Dernière modification par Hizoka (Le 15/01/2023, à 23:14)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#10 Le 16/01/2023, à 07:24
- serged
Re : [Résolu] Vérifier l'existence d'un fichier quelle que soit la casse
find point_montage -uname "profil_a_chercher"
tout simplement !
man find
pour les détails...
LinuxMint Vera Cinnamon et d'autres machines en MATE, XFCE... 20.x , 21.x ou 19.x
Tour : Asus F2A55 / AMD A8-5600K APU 3,6GHz / RAM 16Go / Nvidia GeForce GT610 / LM21.1 Cinnamon
Portable : LDLC Mercure MH : Celeron N3450 /RAM 4Go / Intel HD graphics 500 i915 / biboot Win 10 (sur SSD) - LM21.1 MATE (sur HDD)
Hors ligne
#11 Le 16/01/2023, à 09:00
- Hizoka
Re : [Résolu] Vérifier l'existence d'un fichier quelle que soit la casse
Mon find ne connaît pas -uname.
Il connaît -iname mais ça ne répond pas au besoin puisqu'il faut lui indiquer le dossier en respectant la casse.
Si on part de la base du point de montage le find doit s’exécuter à chaque test sur une énorme quantité de fichier.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#12 Le 16/01/2023, à 09:55
- Hizoka
Re : [Résolu] Vérifier l'existence d'un fichier quelle que soit la casse
Pour le moment, voici quelques retours :
Pour le find recherchant tous les fichiers du point de montage : 3min pour plus de 650 000 fichiers.
Pour un test d'existence de fichier php : 0.004s
Pour un test d'existence via grep depuis php : 0.03s
Donc 10 fois plus lent avec grep mais bien plus rapide que de boucler sur les 650 000 fichiers je pense...
Ce n'est pas super propre mais vu la durée de vie du système, je m'en satisfais surtout vu la durée d’exécution.
Merci à vous, je laisse un peu ouvert voir s'il y a d'autres idées sinon je fermerai le sujet.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#13 Le 16/01/2023, à 10:21
- Tawal
Re : [Résolu] Vérifier l'existence d'un fichier quelle que soit la casse
Hello,
Idée :
Est-il possible de renommer les fichiers en majuscule ou en minuscule avant tout traitement ?
Cela éviterai de devoir tester les noms en ignorant la casse.
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/2023, à 10:56
- iznobe
Re : [Résolu] Vérifier l'existence d'un fichier quelle que soit la casse
Bonjour , vu que les noms de fichiers sont stockés dans une BDD , ca ne serait pas bien plus simple de directement eradiqué le probleme a la source :
focer windows a creer des noms de fichiers tout en miniscules ?
arf ; grillé par @Tawal . j ' avais pas lu jusqu ' a la fin .
Dernière modification par iznobe (Le 16/01/2023, à 10:57)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#15 Le 16/01/2023, à 16:03
- vv221
Re : [Résolu] Vérifier l'existence d'un fichier quelle que soit la casse
Il connaît -iname mais ça ne répond pas au besoin puisqu'il faut lui indiquer le dossier en respectant la casse.
Dans ce cas tu as -ipath :
-path pattern
File name matches shell pattern pattern. The metacharacters do not treat `/' or `.' specially; so, for example,
find . -path "./sr*sc"
will print an entry for a directory called ./src/misc (if one exists). To ignore a whole directory tree, use -prune rather than checking every file in the tree. Note that the pattern match test applies to the whole file name, starting from one of the start points named on the command line. It would only make sense to use an absolute path name here if the relevant start point is also an absolute path. This means that this command will never match anything:
find bar -path /foo/bar/myfile -print
Find compares the -path argument with the concatenation of a directory name and the base name of the file it's examining. Since the concatenation will never end with a slash, -path arguments ending in a slash will match nothing (except perhaps a start point specified on the command line). The predicate -path is also supported by HP-UX find and is part of the POSIX 2008 standard.
-ipath pattern
Like -path. but the match is case insensitive.
Jouer sur Ubuntu ? Facile !
Hors ligne
#16 Le 16/01/2023, à 19:47
- Hizoka
Re : [Résolu] Vérifier l'existence d'un fichier quelle que soit la casse
Je n'ai pas la main coté windows et vu le nombre d'utilisateur qui bosse dessus, imposer des régles de nommage ou autre, c'est mort.
@vv221
Ouais j'ai essayé, mais il recherche partout dans le point de montage (donc 650 000 fichiers) pour trouver tous ceux dont le path correspond.
Sauf si j'ai mal géré, mais c'est ce que j'ai compris de mes tests.
Dernière modification par Hizoka (Le 16/01/2023, à 19:47)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#17 Le 16/01/2023, à 20:57
- iznobe
Re : [Résolu] Vérifier l'existence d'un fichier quelle que soit la casse
il y a tout de meme un point que je ne comprends pas bien dans l ' ennoncé de ton probleme :
- J'ai une liste d'URL (au format windows que je convertis) qui pointe vers ces fichiers qui ne respectent pas franchement la casse.
- Dans un script php hébergé sur un Linux, j'ai besoin de travailler sur ces fichiers (au moins vérifier leur existence à minima).Avez vous une idée de comment vérifier qu'ils existent bien et mieux encore, récupérer la bonne url ?
Je parle bien d'adresse, pas de nom de fichier, le fichier peut être bien nommé mais pas celui d'un dossier parent.
Deja , a quoi ressemble cette fameuse liste d' URL ? moyen d ' en voir 3 ou 4 une fois convertie ?
ensuite tu disq ue tu dois verifier l' existence de ce fichier a partir de l' URL donc ?
puis tu dis vouloir recuperer l' URL , là pour ma part , je bloque ...
quelques exemples concrets me semble indispensable pour mieux comprendre ce que tu cherches a realiser . quitte a modifier les points sensibles bien sur .
Dernière modification par iznobe (Le 16/01/2023, à 20:58)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#18 Le 16/01/2023, à 23:10
- Hizoka
Re : [Résolu] Vérifier l'existence d'un fichier quelle que soit la casse
J'ai pas d'exemple sous la main, le pc du boulot est éteint mais en gros (il n'y a rien à de particulier à ce niveau là),
Les url sont de type :
e:\DisqueExt\DossierA\Fichier1.pdf
E:\DISQUEEXT\DOSSIERA\FICHIER2.PDF
une fois converti ça donne :
/media/hizoka/DisqueExt/DossierA/Fichier1.pdf
/media/hizoka/DISQUEEXT/DOSSIERA/FICHIER2.PDF
Dans l'exemple, le fichier2 n'est pas bon au niveau de la casse.
Du coup, il faut que j'arrive à déterminer la bonne casse car j'essaie de récupérer le nombre de page des fichiers pdf (en autre) depuis un script php qui lui est sensible à la casse.
Je n'ai vraiment la main que sur le php et sur l'Ubuntu mais pas sur le point de montage.
Concrètement ma solution fonctionne :
1) find point-de-montage -type f > Fichiers.txt
2) Script php, un simple file_exists :
i) Il existe, le traitement php continue.
ii) il n'existe pas, appel de la commande grep depuis php : grep -i UrlMauvaiseCasse Fichiers.txt
- Le grep me renvoie la bonne casse si l'url existe vraiment. Je la reprend dans mon php et je continue le traitement.
- Il ne me renvoie rien, le fichier n'existe pas (oui c'est l'une des nombreuses choses que je dois vérifier...) je passe au fichier suivant.
Ça fonctionne, ça ne prend que quelques minutes de plus, donc je vais en rester là.
Je m'étais tourné vers vous en me disant qu'il devait y avoir plus simple mais ça ne semble pas si évident
En tout cas merci pour votre intérêt et vos propositions !
Dernière modification par Hizoka (Le 16/01/2023, à 23:11)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#19 Le 17/01/2023, à 10:24
- iznobe
Re : [Résolu] Vérifier l'existence d'un fichier quelle que soit la casse
ok donc en fait , quand tu disais URL(I) ou adresse , tu voulais dire chemin absolu de ton point de montage ?
dans ce cas , est ce que cette solution pourrait convenir ? : https://forum.ubuntu-fr.org/viewtopic.p … #p21883380
activer cette option te permettrait certainement d ' economiser une commande non ? sur le nombre de fichiers a traiter ce n' est pas negligeable .
Dernière modification par iznobe (Le 17/01/2023, à 10:30)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#20 Le 17/01/2023, à 12:45
- Hizoka
Re : [Résolu] Vérifier l'existence d'un fichier quelle que soit la casse
Oui tout à fait, je parle bien des chemins absolus, désolé si ce n'était pas clair.
Dans un script bash ça serait parfait, le souci est le suivant :
- Impossible d’exécuter ce nocaseglob pour qu'il soit pris en compte par php (même si j’exécute nocaseglob puis lance php script.php).
- Il faut donc que je crée un exécutable que j'appellerai à la place de grep (et du find initial).
- Ce script aurait le nocaseglob puis un test qui vérifie si le fichier existe.
- Mais le truc où je bloque, c'est pour renvoyer la bonne casse à php depuis le script pour travailler sur les fichiers.
Même si je fais un ls / stat / find sur le fichier avec une mauvaise casse il me renvoie la même adresse.
Sinon l'idée est à tester, sûrement un gain de temps de faire un script :
shopt -s nocaseglob
if [[ -e "$1" ]]
then
echo "La bonne adresse"
return 0
else
return 1
fi
shopt -u nocaseglob
plutôt que d'utiliser grep sur un gros fichier.
Et en faisant des tests, je me rends compte que la casse n'est pas prise en compte dans bash pour ce point de montage (uniquement)...
étrange, ça veut dire que :
- bash : [[ -e "/media/hizoka/DisqueExt/DoSiEr/FichIER.pDF" ]] && echo ok # => OK
- php if(file_exists("/media/hizoka/DisqueExt/DoSiEr/FichIER.pDF")) echo ok => PAS OK
Mais je reste sur mon souci de renvoi de la bonne casse depuis un script bash.
Dernière modification par Hizoka (Le 17/01/2023, à 12:46)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#21 Le 17/01/2023, à 15:33
- Watael
Re : [Résolu] Vérifier l'existence d'un fichier quelle que soit la casse
au fait, pourquoi PHP ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#22 Le 17/01/2023, à 15:37
- iznobe
Re : [Résolu] Vérifier l'existence d'un fichier quelle que soit la casse
en partant de ton script ci dessus , tu pourrais par exemple faire un :
if [[ -e "$1" ]]
then
#recuperer le basepath , / , ajouter le nom au Q dans une variable puis
echo "$Le_bon_chemin" >> fichier/temp
return 0
et avec php lire le contenu de fichier/temp pou travailler dessus peut etre , niveau temps d ' execution je ne sais pas ce que ca donnerait .
Dernière modification par iznobe (Le 17/01/2023, à 15:38)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#23 Le 17/01/2023, à 15:42
- LeoMajor
Re : [Résolu] Vérifier l'existence d'un fichier quelle que soit la casse
salut
si un device & inode est défini, alors un objet glob, peut y être défini, quelque soit l'encodage.
à essayer: faire un test sur stat en php, ...
stat -c %d:%i target
64769:4195515
php > $testa = stat('target');
php > echo $testa[0] . ':' . $testa[1];
64769:4195515
si stat échoue, alors il n' a pas d'entité file system correspondant. La cible n'existe pas.
Hors ligne
#24 Le 17/01/2023, à 18:46
- Hizoka
Re : [Résolu] Vérifier l'existence d'un fichier quelle que soit la casse
@Watael
Car j'affichais des options avant le lancement sur une page web pour les utilisateurs.
Ce n'est plus d'actualité mais beaucoup trop lourd de passer sur python par ex (grosse gestion de bases de données).
@iznobe
Bah ouais, c'est ce que je veux, mais comment tu récupéres la bonne casse de $Le_bon_chemin ?
ls cheMiN_a_la_Con
=> cheMiN_a_la_Con
stat cheMiN_a_la_Con
=> Fichier : cheMiN_a_la_Con
@LeoMajor
Que la casse soit bonne ou non, j'ai un résultat en effet mais il me faut la bonne casse au final car j'ai des traitements à faire sur les fichiers et php est sensible à la casse.
si je teste :
stat -c %d:%i cheMiN_a_la_Con
57:421802
stat -c %d:%i BonChemin
57:2814744980...
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#25 Le 17/01/2023, à 19:07
- iznobe
Re : [Résolu] Vérifier l'existence d'un fichier quelle que soit la casse
et si tu fais dans le script :
shopt -s nocaseglob
if [[ -f "$1"* ]]
then
echo "La bonne adresse"
return 0
else
return 1
fi
shopt -u nocaseglob
ca donne quoi ?
mais ça ne marche pas si tu donnes le nom exact du fichier
$ ls -d ~/documents
ls: cannot access /home/yves/documents: No such file or directory$ ls -d ~/documents*
/home/user/Documents
l ' astuce consiste a ajouter un " * " a la fin du " vrai " nom ( nom de depart plutot ) .
Dernière modification par iznobe (Le 17/01/2023, à 19:10)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne