#1 Le 25/09/2017, à 19:27
- HPIR40
[Resolu] Gestion d'un fichier pour traitement ultérieur
Bonjour
Je rencontre un soucis pour un script et là j'avoue je calle, si vous avez une solution je suis preneur.
Voici la situation:
Pour le moment à la fin de la prog j'ai un fichier sous ce type de format
option1 /directory1/directory2/directory3/directory4
option2 /directory1/directory2/directory5/directory6/directory7
option3 /directory1/directory2/directory5/directory6/directory7/directory9/file10
Le but est, en traitant automatiquement ce fichier, d'éliminer à la fois date2 /directory1/directory2/directory5/directory6/directory7 et date3 /directory1/directory2/directory5/directory6/directory7/directory9/file10 qu'ils ont en commun /directory1/directory2/directory5/directory6/directory7. mais bien entendu /directory1/directory2/directory5/directory6/directory7 peut varier suivant le traitement en amont.
J'ai essayé avec sort/uniq mais rien à faire ou alors il me supprime une des lignes mais pas les deux.
Autre solution c'est de partir d'un fichierA avec date3 /directory1/directory2/directory5/directory6/directory7/directory9/file10, de supprimer de fichierB la ligne date2 /directory1/directory2/directory5/directory6/directory7 puisque elles ont /directory1/directory2/directory5/directory6/directory7 en commun
Je sais c'est un peu tordu, mais pour un cerveau humain c'est facile à faire donc il doit bien y avoir un moyen de le traiter automatiquement.
Mais la je ne vois pas du tout comment faire et d'ailleurs je ne sais même si ce type de traitement est possible.
Merci pour vos lumières
Dernière modification par HPIR40 (Le 28/09/2017, à 08:31)
Hors ligne
#2 Le 25/09/2017, à 20:18
- Watael
Re : [Resolu] Gestion d'un fichier pour traitement ultérieur
[...] pour un cerveau humain c'est facile à faire donc il doit bien y avoir un moyen de le traiter automatiquement.
heu, pas pour le mien
pourquoi ne pas tout supprimer puisqu'ils ont tous en commun "/dir1/dir2" ?
il faut développer le raisonnement sous-jacent.
Dernière modification par Watael (Le 25/09/2017, à 20:21)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 25/09/2017, à 20:22
- pingouinux
Re : [Resolu] Gestion d'un fichier pour traitement ultérieur
Bonsoir,
Pour le moment à la fin de la prog j'ai un fichier sous ce type de format
Autre solution c'est de partir d'un fichierA avec ....., de supprimer de fichierB la ligne .....
Ta demande ne me paraît pas claire. Au départ, tu as un seul fichier, ou deux ? Quel résultat veux-tu obtenir ?
Merci d'utiliser les balises-code <> pour montrer les fichiers ou les résultats de commandes.
Hors ligne
#4 Le 26/09/2017, à 09:50
- HPIR40
Re : [Resolu] Gestion d'un fichier pour traitement ultérieur
Bon je vais être un peu plus clair
j'ai un montage disque reseau sous cette forme:
/data/projet1/
/data/projet2/
/data/projet3/
etc....
chaque projet contient des sous dossiers standard donc sur un ls -l je vais avoir:
/data/projet1/01-administratif
/data/projet1/02-commercial
/data/projet1/03-realisation
/data/projet1/04-documents_divers
/data/projet2/01-administratif
/data/projet2/02-commercial
/data/projet2/03-realisation
/data/projet2/04-documents_divers
/data/projet3/01-administratif
/data/projet3/02-commercial
/data/projet3/03-realisation
/data/projet3/04-documents_divers
etc...
le but pour moi est de vérifier que le document reunion. a bien été créé et sauvegardé dans chaque sous répertoires 04-documents_divers de chaque projet et donc en finalité de lister les projets ou ce fichier n'a pas été créé.
Je fais donc une premiere recherche de ce fichier docx via la commande find et par exemple il me sors bien:
/data/projet3/04-documents_divers/planning.docx
cela veut dire que projet 1 et projet 2 n'ont pas ce fameux fichier docx, c'est donc c'est cette fameuse info que je veux sortir.
donc ce que je pensais faire, c'est simplement lister les projets pour sortir un fichier de ce type la (je n'ai pas besoin d'aller plus loin dans l'arborescence):
/data/projet1/
/data/projet2/
/data/projet3/
et sortir un fichier final amputé de /data/project3/ car il contient le fameux fichier docx.
pour avoir à la fin un listing de ce type par exemple
/data/projet1/
/data/projet2/
c'est sur cette dernière phase que je bute.
merci pour votre aide
Dernière modification par HPIR40 (Le 26/09/2017, à 10:14)
Hors ligne
#5 Le 26/09/2017, à 10:29
- pingouinux
Re : [Resolu] Gestion d'un fichier pour traitement ultérieur
Tu peux essayer ceci :
grep -vf <(cut -d/ -f1-3 <(find /data/projet* -name \*.docx)) fichier_contenant_la_liste_des_repertoires | cut -d/ -f1-3 | sort -u
Hors ligne
#6 Le 26/09/2017, à 15:54
- HPIR40
Re : [Resolu] Gestion d'un fichier pour traitement ultérieur
merci
je vais essayer ça demain, la je suis un peu charette sur autre chose.
Hors ligne
#7 Le 26/09/2017, à 16:49
- Watael
Re : [Resolu] Gestion d'un fichier pour traitement ultérieur
salut,
trouvé en STFW :
find "$srcDir" -mindepth 1 -type d ! -exec test -f {}/"$filename" \; -print
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#8 Le 26/09/2017, à 17:47
- HPIR40
Re : [Resolu] Gestion d'un fichier pour traitement ultérieur
salut,
trouvé en STFW :
find "$srcDir" -mindepth 1 -type d ! -exec test -f {}/"$filename" \; -print
ca peut être pas mal aussi mais quid des variables?
srcDir=/data/projet*
et
filename=*.docx
c'est bien ça ?
Par contre test c'est quoi? c'est mon fichier listant les directory?
Dernière modification par HPIR40 (Le 26/09/2017, à 17:48)
Hors ligne
#9 Le 26/09/2017, à 20:06
- Watael
Re : [Resolu] Gestion d'un fichier pour traitement ultérieur
test est une commande shell.
test -f teste si l'argument est un fichier régulier.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#10 Le 26/09/2017, à 20:35
- HPIR40
Re : [Resolu] Gestion d'un fichier pour traitement ultérieur
ok je ne connaissais pas cette commande. merci
Hors ligne
#11 Le 27/09/2017, à 09:17
- HPIR40
Re : [Resolu] Gestion d'un fichier pour traitement ultérieur
salut,
trouvé en STFW :
find "$srcDir" -mindepth 1 -type d ! -exec test -f {}/"$filename" \; -print
Bonjour
Bon cette commande ne fonctionne pas car il continue malgré tout a me lister le fameux fichier doc
d'ailleurs j'ai modifié la commande comme suit:
find "$srcDir" -maxdepth 1 -type d ! -exec test -f {}/"$filename" \; -print
pour avoir uniquement le listing des directory, mais quoi qu'il en soit il ne m'exclus pas la directory contenant le fichier planning.docx
concernant la variable $filename je l'ai écrite comme suit pour élargir au mieux la recherche
filename=*lanning*.docx
Et rien a faire la directory est toujours la car en effet il y a d'autres fichiers qui eux aussi sont listés donc la directory a quand même une raison d'être listé.
Il faudrait réussir à l'exclure quoi qu'il arrive du moment qu'elle contient ce fameux fichier docx
Dernière modification par HPIR40 (Le 27/09/2017, à 15:04)
Hors ligne
#12 Le 27/09/2017, à 09:20
- HPIR40
Re : [Resolu] Gestion d'un fichier pour traitement ultérieur
Tu peux essayer ceci :
grep -vf <(cut -d/ -f1-3 <(find /data/projet* -name \*.docx)) fichier_contenant_la_liste_des_repertoires | cut -d/ -f1-3 | sort -u
Je viens d'essayer cette commande
elle me sort: sh: syntax error near unexpected token `('
pourtant tout me semble ok et pour le fichier_contenant_la_liste_des_repertoires j'ai indiqué le chemin complet.
Hors ligne
#13 Le 27/09/2017, à 09:22
- pingouinux
Re : [Resolu] Gestion d'un fichier pour traitement ultérieur
@HPIR40 #12 : Il faut lancer la commande en bash, et non en sh
Hors ligne
#14 Le 27/09/2017, à 09:59
- HPIR40
Re : [Resolu] Gestion d'un fichier pour traitement ultérieur
en bash ca va mieux en effet
mais toujours pas le résultat recherché
comme le chemin est plus long que sur les exemples que j'ai donné j'ai bien sur mis le chemin tel qu'il est en realité et surtout remplacé
cut -d/ -f1-3
par
cut -d/ -f1-8
mais je me retrouve avec des dossiers qui sont listés 3 fois alors qu'il ne l'étaient que une fois avant et mon dossier a supprimer qui est listé 2 fois
voila la commande complète que j'ai entré (vrai nom des directory changé bien sur)
grep -vf <(cut -d/ -f1-8 <(find /volumex/data/directory/directory/directory/dossier_de_travail* -name \*lanning*.docx)) /volumey/home/admin/directory_list | cut -d/ -f1-8 | sort -u
Hors ligne
#15 Le 27/09/2017, à 10:55
- pingouinux
Re : [Resolu] Gestion d'un fichier pour traitement ultérieur
Peux-tu montrer quelques lignes du résultat de cette commande
find /volumex/data/directory/directory/directory/dossier_de_travail* -name \*lanning\*.docx
et le résultat de celle-ci
head /volumey/home/admin/directory_list
Ajouté :
Il me semble quil faut mettre
cut -d/ -f1-7
Dernière modification par pingouinux (Le 27/09/2017, à 11:21)
Hors ligne
#16 Le 27/09/2017, à 14:25
- HPIR40
Re : [Resolu] Gestion d'un fichier pour traitement ultérieur
il faut bien un
cut -d/ -f1-8
alors j'ai une recherche a faire dans 3 dossiers voici les retours:
# find /volumex/data/directory/directory/directory/dossier_de_travail1/* -name \*lanning*\*.docx
il ne trouve rien c'est normal
# /volumex/data/directory/directory/directory/dossier_de_travail2/* -name \*lanning*\*.docx
/volumex/data/directory/directory/directory/dossier_de_travail2/affaire100/01-Documents/pour test admin-planning.docx
/volumex/data/directory/directory/directory/dossier_de_travail2/affaire100/01-Documents/@eaDir/pour test admin-planning.docx (cette dernière ligne c'est parce que je suis sur un NAS synology)
# find /volumex/data/directory/directory/directory/dossier_de_travail3/* -name \*lanning*\*.docx
il ne trouve rien c'est normal
dossier_de_travail1, 2 et 3 ne s'appellent pas comme cela en réalité, ce sont des noms sans aucun rapport l'un avec l'autre, d'où les 3 recherches séparées, je scripterai ensuite cela avec des variables quand ça fonctionnera.
et voila le head de directory_list (il est petit car je filtre par période lors de la création de ce dossier pour éviter de me retrouver avec mes 200 repertoires dedans)
/volumex/data/directory/directory/directory/dossier_de_travail1/affaire200
/volumex/data/directory/directory/directory/dossier_de_travail2/affaire101
/volumex/data/directory/directory/directory/dossier_de_travail2/affaire100
c'est donc bien /volumex/data/directory/directory/directory/dossier_de_travail2/affaire100 que je veux faire disparaitre de la liste par un traitement supplémentaire
pour finir voila le script final que je lance pour créer le dernier fichier
#!/bin/bash
grep -vf <(cut -d/ -f1-8 <(find /volumex/data/directory/directory/directory/dossier_de_travail1/* -name \*lanning*\*.docx)) /volumey/home/admin/directory_list | cut -d/ -f1-8 | sort -u > /volumey/home/admin/directory_list_final
grep -vf <(cut -d/ -f1-8 <(find /volumex/data/directory/directory/directory/dossier_de_travail2/* -name \*lanning*\*.docx)) /volumey/home/admin/directory_list | cut -d/ -f1-8 | sort -u >> /volumey/home/admin/directory_list_final
grep -vf <(cut -d/ -f1-8 <(find /volumex/data/directory/directory/directory/dossier_de_travail3/* -name \*lanning*\*.docx)) /volumey/home/admin/directory_list | cut -d/ -f1-8 | sort -u >> /volumey/home/admin/directory_list_final
et voila le head de directory_list_final ou il pète les plombs
/volumex/data/directory/directory/directory/dossier_de_travail1/affaire200
/volumex/data/directory/directory/directory/dossier_de_travail2/affaire101
/volumex/data/directory/directory/directory/dossier_de_travail2/affaire100
/volumex/data/directory/directory/directory/dossier_de_travail1/affaire200
/volumex/data/directory/directory/directory/dossier_de_travail2/affaire101
/volumex/data/directory/directory/directory/dossier_de_travail1/affaire200
/volumex/data/directory/directory/directory/dossier_de_travail2/affaire101
/volumex/data/directory/directory/directory/dossier_de_travail2/affaire100
Dernière modification par HPIR40 (Le 27/09/2017, à 15:00)
Hors ligne
#17 Le 27/09/2017, à 15:40
- pingouinux
Re : [Resolu] Gestion d'un fichier pour traitement ultérieur
Si tu le fais en plusieurs commandes, ça ne risque pas de marcher.
Essaye ceci :
#!/bin/bash
grep -vf <(cut -d/ -f1-8 <(find /volumex/data/directory/directory/directory/dossier_de_travail[1-3] -name \*lanning*\*.docx)) /volumey/home/admin/directory_list | cut -d/ -f1-8 | sort -u > /volumey/home/admin/directory_list_final
Ou bien en passant par un fichier intermédiaire :
#!/bin/bash
(
find /volumex/data/directory/directory/directory/dossier_de_travail1 -name \*lanning*\*.docx
find /volumex/data/directory/directory/directory/dossier_de_travail2 -name \*lanning*\*.docx
find /volumex/data/directory/directory/directory/dossier_de_travail3 -name \*lanning*\*.docx
) >/volumey/home/admin/mes_fichiers
grep -vf <(cut -d/ -f1-8 /volumey/home/admin/mes_fichiers) /volumey/home/admin/directory_list | cut -d/ -f1-8 | sort -u > /volumey/home/admin/directory_list_final
Hors ligne
#18 Le 27/09/2017, à 17:43
- HPIR40
Re : [Resolu] Gestion d'un fichier pour traitement ultérieur
merci, je regarde ça demain matin
Hors ligne
#19 Le 28/09/2017, à 08:31
- HPIR40
Re : [Resolu] Gestion d'un fichier pour traitement ultérieur
Bonjour
Je viens de tester le script final, c'est nickel il fonctionne parfaitement
Merci beaucoup pour ton aide
Hors ligne
#20 Le 29/09/2017, à 07:16
- serged
Re : [Resolu] Gestion d'un fichier pour traitement ultérieur
ok je ne connaissais pas cette commande. merci
D'où l'erreur de débutant, qui est de nommer un script (ou un exécutable) "test" et de s'étonner qu'il ne fait pas ce qu'il voulait !
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
#21 Le 29/09/2017, à 09:15
- moko138
Re : [Resolu] Gestion d'un fichier pour traitement ultérieur
[HS]
Je me suis fait tromper par ma pipière.
c'est sur cette dernière phase que je bute.
Essaie encore...
[/HS]
%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel : À la découverte de dcraw
Hors ligne
#22 Le 29/09/2017, à 14:13
- Watael
Re : [Resolu] Gestion d'un fichier pour traitement ultérieur
en allant plus loin qu'un simple test
find "$srcDir" -mindepth 1 -type d \( -exec sh -c 'for f in "$1"/*; do if test -f "$f"; then if test "$f" = "$1/$2"; then exit 1; fi; fi; done' sh "{}" "$filename" \; -a -print \)
ça semble fonctionner...
Dernière modification par Watael (Le 29/09/2017, à 14:22)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne