Sous-dossiers en ordre alphabétique et extraire des donnée du fichier

Résolu/Fermé
billyV33 Messages postés 23 Date d'inscription dimanche 10 février 2019 Statut Membre Dernière intervention 9 mars 2022 - Modifié le 15 févr. 2019 à 23:37
lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 - 16 févr. 2019 à 23:32
Bonjour à vous,

J'ai un gros problème! Je voudrais trier les noms des sous-dossiers dans un répertoire parent pour les mettre en ordre alphabétique pour enfin aller lire chaque fichier qui se trouve dans chaque sous-répertoire pour y extraire juste les 3 premier octet de chaque fichier

je suis capable d'aller chercher avec find et head les 3 premiers octets de chaque fichier
$ find . -type f -exec head -c3 {} \; | sort

mon problème et que avant de faire un head il me faudrait faire un sort des noms des sous-sossiers

$ find . -type d -print | sort

je peux afficher les noms des sous-dossiers en ordre alphabétique mais je ne réussi pas à descendre jusqu'aux fichiers en faisant comme une boucle pour extraire les 3 octets avec head... POURQUOI!!!


find . -type f -name "*" -print | cut -d/ -f2 | sort| head -c3

j'ai essayé plein de combinaisons possibles mais sans succès
find . -type f -name "*" -print | cut -d/ -f2 | sort | -exec head -c3 {} \;

ici head m'affiche juste les 3 octets du premier fichier...
j'ai essayé avec xargs , -exec {} \; ... rien à faire...
find . -type f -name "*" -print | sort | head -c3

ça fait presque toute la semaine que j'essaie de trouver un façon de faire mais je ne comprend vraiment pas!

finalement, je me fraudais les noms des sous-dossiers en ordre alphabétique et fur et 'a mesure extraire
les 3 octets de chaque fichier qui se retrouve à l'intérieur

pas sûr d'être claire mais bon...


Merci de m'aider!!!



Configuration: Linux / Firefox 60.0
A voir également:

5 réponses

lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 13
Modifié le 16 févr. 2019 à 01:13
salut,

c'est peut-être compliqué, mais si tu insiste pour utiliser
find
, il faut ajouter des caractères NULL (
\0
) à la sortie de
find
, puis faire lire son entrée à
sort
avec ce même caractère NULL comme séparateur, puis passer cette sortie à
xargs
pour effectuer le traitement sur chaque fichier. ouf! c'est tout.
$ find "$repSrc"  -type f -print0 | sort -z | xargs -0 -I {} cut -c3 {} >fichier.out


ou alors tu utilises le shell, qui, lui, trie les fichiers par ordre alphabétique :
for d in "$repSrc"/*/
do
   for f in "$d"/*
   do
      test -f "$f" && cut -3 "$f"
   done
done >fichier.out
/!\ pas testé.
s'il faut descendre plus loin dans le
$repSrc
, en bash uniquement :
shopt -s globstar nullglob
for f in "$repSrc"/**/*
do
   test -f "$f" && cut -c 3 "$f"
done >fichier.out
à vérifier...
0
billyV33 Messages postés 23 Date d'inscription dimanche 10 février 2019 Statut Membre Dernière intervention 9 mars 2022
16 févr. 2019 à 01:49
Bonjour lEprofSonDkon !


find ./dossier/ -type f -print0 | sort -z | xargs -0 -I {} head -c3 {} > fichier.out

on dirait que le sort ne tri pas les sous-dossiers en ordre alphabétique
dossier/
/sous-dos3/ texte dans le fichier :
fichierA --> ton aide!
/sous-dos1/
fichierB --> Merci
/sous-dos2/
fichierC --> de

donc un premier tri pour avoir sous-dos1 sous-dos2 sous-dos3 et lire dans chacun d’eux son fichier pour avoir
Merci de ton aide! :)

Mais je viens d'apprendre qu'on peut faire suivre deux cmds avec xargs! WOW!

c'est presque ce que je cherche mais toujours pas ma phrase dans l'ordre
j'ai mis head -c3 à la place de cut pour avoir les 3 octets des fichiers ce qui fonctionne très bien

$ find ./artefacts/ -type f -print0 | sort -z | xargs -0 head -c3 {} ;
head: impossible d'ouvrir '{}' en lecture: Aucun fichier ou dossier de ce type

j'ai les sous-dossiers bien en ordre alphabétique.. je ne comprend pas trop l'erreur par contre!

Mais je me demande si je ne dois pas avoir les fichier en ordre alphabétique...
ça va me prendre un moment pour confirmer mais je reviens le plus vite possible!

Merci énormément lEprofSonDkon!!!
:):)
0
lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 13
Modifié le 16 févr. 2019 à 02:51
en traitant les dossiers, et si il n'y a qu'un seul fichier dans chaque sous-dossier :
find dossier/ -mindepth 1 -type d -printf '%p\0' | sort -z | xargs -0 -I {} bash -c 'cut -b 3 "$1"/*' _ {}

il faut adapter à ta "configuration".
si j'utilise la hiérarchie donnée en exemple, avec
bash -c 'echo -n  "$(<"$1"/*)"' _ {}; echo
, j'obtiens bien la phrase.

sans la structure complète, je ne crois pas pouvoir aider davantage.
0
billyV33 Messages postés 23 Date d'inscription dimanche 10 février 2019 Statut Membre Dernière intervention 9 mars 2022
16 févr. 2019 à 03:29
Oui je comprend ça :)
le bash pas encore vu comme ça en ligne de commande mais tes exemples m'aident beaucoup.
Finalement, après avoir décortiqué en dehors du terminal
vu que j'ai trouver la réponse à l'énigme mais je ne trouve pas la façon de la traiter
je viens de me rendre compte que se sont les fichiers que je dois mettre en ordre alphabétique
Désolée pour ça !mais j'avais demandé et on m'avait dit que c'était les dossiers... donc...
là il faut que je liste en ordre alphabétique les fichiers qui se trouvent dans les sous-dossiers et extraire les 3 octets
Avec tes explications et exemples je vais me remettre au travail!! :)

Merci beaucoup beaucoup!!!

Pour répondre à ton énigme :):)
tree
.
├── dossierParent dossier
│   ├── alasta sous-dossier
│   │   └── admi fichier
│   ├── alat
│   │   └── ac
│   ├── apupy
│   │   └── taig
│   ├── aukiol
│   │   └── desac
│   ├── epat
│   │   └── neige
│   ├── ero
│   │   └── lecaille
│   ├── etu
│   │   └── reem
│   .... ainsi de suite...
0
lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 13 > billyV33 Messages postés 23 Date d'inscription dimanche 10 février 2019 Statut Membre Dernière intervention 9 mars 2022
Modifié le 16 févr. 2019 à 03:47
find /tmp/dossier/ -type f -printf '%h#%f\0' | sort -z -t '#' -k2 | xargs -0 printf '%s\n'
0
billyV33 Messages postés 23 Date d'inscription dimanche 10 février 2019 Statut Membre Dernière intervention 9 mars 2022
16 févr. 2019 à 04:11
GENIALE!!! Merci merci!
vraiment ! l'ordre des fichiers sortent à merveille!! Merci encore!!!
La ligne est un peu complexe pour moi mais je la comprend assez bien
par contre ce que je ne pige pas c'est comment ajouter mon head -c3 à la fin!
pour avoir les 3 octets
vraiment un mystère pour moi.. je ne comprend pas la logique
pourquoi je ne peux ajouter une simple suite après xargs -0 printf '%s\n' ?
je devrais pouvoir continuer en ajoutant
{} head -c3 {};
ou
| xargs -0 printf '%s\n' {} | xargs head -c3
non?
mais non!
il ne traite pas le head mais je ne comprends pas pourquoi désolée ...
0
lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 13
16 févr. 2019 à 04:49
meuh, non ! tu remplaces simplement
printf
par ta commande.
il n'était là que pour te montrer ce que traite
xargs
. :)
0
billyV33 Messages postés 23 Date d'inscription dimanche 10 février 2019 Statut Membre Dernière intervention 9 mars 2022
16 févr. 2019 à 05:19
Bonsoir lEprofSonDkon
Je ne comprend pas trop ta réponse
j'ai essayer plusieurs remplacements mais vu que je ne comprend pas le pourquoi je ne trouve pas de solution mamma mia! je pense que je vais rendre mon TP pas terminé... la seule chose que j'ai réussi c'est de trouver la prophétie mais pas comment le faire en ligne de cmd

find ./artefacts/ -type f -printf '%h#%f\0' | sort -z -t '#' -k2 | xargs -0 head -c3
head: impossible d'ouvrir './artefacts/verisessa#accusons' en lecture: Aucun fichier ou dossier de ce type

Merci beaucoup de ton aide lEprofSonDkon :)
je vais devoir aller me coucher ... demain je travaille!
peut-être que la nuit va me débloquer un neurone ... on ne sait jamais!

Je reviendrais demain si toujours disponible à m'aider! :):)

Merci beaucoup et bonne soirée
0
lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 13
Modifié le 16 févr. 2019 à 05:56
find ./artefacts/ -type f -printf '%h#%f\0' | sort -z -t '#' -k2 | sed 's/#/\//g' | xargs -0 head -c3 

ben oui, si on ne restaure pas les chemins vers les fichiers, ils ne seront pas trouvé !

ton prof va vraiment croire que tu as trouvé ça toute seule ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
billyV33 Messages postés 23 Date d'inscription dimanche 10 février 2019 Statut Membre Dernière intervention 9 mars 2022
16 févr. 2019 à 21:40
Bonjour lEprofSonDkon !!

me revoilà!
Merci INFINIMENT!

Biensûr que non! haha! mais je ne lui rendrais pas la cmd telle quelle!
maintenant que j'ai réussi jusqu'à la fin grâce à ton aide et, pas juste avoir trouvé la réponse mais aussi avoir compris pourquoi ça ne fonctionnait pas entre le sort et le head!!!
En plus avec tous les exemples que tu m'as donnés j'ai découverts des astuces très intéressantes! Merci!!
Mais si jamais je ne trouve pas avant la date butoir, je ne suis pas à 4 points près! ça ne me dérange pas de dire que je me suis fais aider en expliquant mes démarches précédentes, en expliquant la commande que tu m'as donnée pour montrer que je comprend ce qui se passe et pas juste un copie coller pur et bête !


J'ai terminé en ajoutant un grep -vh pour éliminer les "==>" de la sortie et envoyé dans un fichier tmp... c'est sûr je pourrais utiliser la contre redirection... maintenant que j'y pense ... pour continuer la cmd avec le tr
je vais tester après j'étais trop contente de voir mission réussite!!!

et le tr -d '\n' pour éliminer les sauts de fin de lignes. Ce qui m'a permis d'avoir les mots complets...c'était bien pensé comme astuce! je ne pouvais pas tout simplement les mettre sur une ligne sinon j'avais juste les 3 octets avec un espace entre chaque. Ce qui me don nai t des cho ses dan s le gen re! :)


find ./artefacts/ -type f -printf '%h#%f\0' | sort -z -t '#' -k2 | sed 's/#/\//g' | xargs -0 head -c3 | grep -vh "==>" > prophetietmp.txt

tr -d '\n' < prophetietmp.txt > prophetie.txt

Il vaut mieux comprendre qu'avoir un 100% à l'aveugle!!
encore merci beaucoup pour ce coup de main

ce fut un plaisir!!
Bonne journée!

je vais mettre la question à Résolue! :):):)
0
lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 13
16 févr. 2019 à 23:32
continue comme ça, c'est très bien.
0