Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2306 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  Lister répertoires ne contenant pas un type de fichier ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Lister répertoires ne contenant pas un type de fichier ?

n°1439389
snowden
Posté le 23-10-2019 à 10:17:29  profilanswer
 

Bonjour,
Je cherche une commande qui me permettre de chercher dans une liste de répertoires lesquels ne contiennent pas un certain type de fichier par son extension.
 
 
Merci par avance pour votre aide.


---------------
« A l’origine de toute erreur attribuée à l’ordinateur, vous trouverez au moins deux erreurs humaines. Dont celle consistant à attribuer l’erreur à l’ordinateur. »
mood
Publicité
Posté le 23-10-2019 à 10:17:29  profilanswer
 

n°1439392
kajoux
Posté le 23-10-2019 à 11:46:10  profilanswer
 

Si ton extension à exclure est ".ext", et que ta liste de répertoires a été mise dans un tableau reps=('rep1' 'rep2' … 'repn'), alors tu peux faire

shopt -s nullglob
for rep in "${reps[@]}"; do test "$(echo "$rep"/*.ext)" || echo "$rep"; done


Si ta liste de répertoires est contenue dans un unique répertoire parent "prep", alors le tableau n'est plus nécessaire et tu peux te contenter de faire

shopt -s nullglob
for rep in prep/*; do test "$(echo "$rep"/*.ext)" || echo "$rep"; done


Tu peux aussi chercher les répertoires dans une arborescence à partir d'un répertoire parent "prep", et leur appliquer le test ci-dessus :

shopt -s nullglob
while IFS='' read -r -d '' rep; do test "$(echo "$rep"/*.ext)" || echo "$rep"; done < <(find prep -type d -print0)


Message édité par kajoux le 23-10-2019 à 13:29:03
n°1439393
snowden
Posté le 23-10-2019 à 12:17:51  profilanswer
 

Bonjour kajoux et merci pour ta réponse.
 
En faite, je veux scanner une médiathèque de films et chaque dossier contient normalement des images jpg. Or certains dossier n'ont pas leurs images respectives et malheureusement, je ne les connais pas mais je sais qu'il y en a.
 
Par contre, les commandes que tu donnes, je suppose que je dois créer un script avec non ? Je demande ça car elles sont sur deux lignes.


---------------
« A l’origine de toute erreur attribuée à l’ordinateur, vous trouverez au moins deux erreurs humaines. Dont celle consistant à attribuer l’erreur à l’ordinateur. »
n°1439395
kajoux
Posté le 23-10-2019 à 13:21:08  profilanswer
 

Non, pas besoin de faire un script.
Tu rentres d'abord la première commande

shopt -s nullglob


pour dire au shell de renvoyer une chaine de caractères vide lorsqu'il ne trouve rien dans un répertoire (nécessaire pour le bon fonctionnement du test ensuite), puis tu rentres la seconde commande.
Mais tu peux aussi tout mettre sur une ligne comme ça :

shopt -s nullglob && seconde-commande


Le plus simple est peut-être que tu utilises la troisième version que je t'ai donnée, où tu remplaces ".ext" par ".jpg" et "prep" par le chemin vers ta médiathèque.
Donc si par exemple ta médiathèque se situe dans le répertoire "Vidéos" de ton home, ça donnerait

shopt -s nullglob && while IFS='' read -r -d '' rep; do test "$(echo "$rep"/*.jpg)" || echo "$rep"; done < <(find ~/Vidéos -type d -print0)


 
Rq : il manquait une petite chose dans les commandes données plus haut (le "echo" pour tout regrouper en une opérande pour le test), que j'ai corrigée.


Message édité par kajoux le 23-10-2019 à 13:35:17
n°1439397
snowden
Posté le 23-10-2019 à 14:54:46  profilanswer
 

Merci beaucoup kajoux, ça à l'air de bien fonctionner.
 
Il est possible d'exclure un répertoire contenant le mot "saga" sans exclure les répertoires qui sont dans ce répertoire stp ?


Message édité par snowden le 23-10-2019 à 15:11:21

---------------
« A l’origine de toute erreur attribuée à l’ordinateur, vous trouverez au moins deux erreurs humaines. Dont celle consistant à attribuer l’erreur à l’ordinateur. »
n°1439399
kajoux
Posté le 23-10-2019 à 15:21:50  profilanswer
 

Oui, il suffit de l'indiquer à find en lui rajoutant un "! -name '*saga*'" (ça ignorera tous les répertoires contenant le mot "saga" par contre, à toi d'adapter si il faut être plus précis dans l'exclusion) :

shopt -s nullglob && while IFS='' read -r -d '' rep; do test "$(echo "$rep"/*.jpg)" || echo "$rep"; done < <(find ~/Vidéos -type d ! -name '*saga*' -print0)

n°1439401
snowden
Posté le 23-10-2019 à 15:59:19  profilanswer
 

Et ça prendra quand même en compte les répertoires contenus dans les répertoires qui ont "saga" dans leurs noms ?
 
Merci en tout cas pour ton aide précieuse ;)


---------------
« A l’origine de toute erreur attribuée à l’ordinateur, vous trouverez au moins deux erreurs humaines. Dont celle consistant à attribuer l’erreur à l’ordinateur. »
n°1439402
kajoux
Posté le 23-10-2019 à 16:23:05  profilanswer
 

Oui, car le "! -name" exclut des répertoires uniquement dans le résultat renvoyé par find, pas dans la liste dans laquelle il effectue sa recherche.
Donc il n'affichera pas les répertoires dont le nom contient "saga", mais il cherchera bien dedans.
Essaie et tu verras !  ;)

n°1439404
snowden
Posté le 23-10-2019 à 18:27:06  profilanswer
 

Bizarre car la commande fonctionne à moitié... Ou plutôt à 95%.
 
Disons que sur 100 résultats avec Saga, il m'en affiche 10.
Et pareil, il faut que je relance cette commande pour qu'elle fonctionne à 95% sinon, elle ne passe pas et ça m'affiche tous les "Saga".
 
J'ai bien évidemment fait attention à la casse avec le S en majuscule comme dans les noms de mes répertoires.


---------------
« A l’origine de toute erreur attribuée à l’ordinateur, vous trouverez au moins deux erreurs humaines. Dont celle consistant à attribuer l’erreur à l’ordinateur. »
n°1439407
kajoux
Posté le 23-10-2019 à 19:37:40  profilanswer
 

Non, cette commande est déterministe.
Pas d'histoire de pourcentage ou de comportement différent selon les tirages ici, à part éventuellement l'ordre dans lequel find va envoyer les répertoires, mais le contenu global de la liste sera le même.
Il faudrait que tu sois plus précis, en donnant des retours de commande, ou au moins des noms complets de répertoires problématiques (listés qui n'auraient pas dû l'être, ou non listés qui auraient dû l'être).
 
Et effectivement, avec la syntaxe donnée ci-dessus, find est sensible à la casse.
Si tu veux exclure à la fois les répertoires en "*saga*" et "*Saga*", il faut mettre "-iname" au lieu de "-name" dans le find.

mood
Publicité
Posté le 23-10-2019 à 19:37:40  profilanswer
 

n°1439427
snowden
Posté le 24-10-2019 à 06:59:04  profilanswer
 

Commande testée :

Code :
  1. shopt -s nullglob && while IFS='' read -r -d '' rep; do test "$(echo "$rep"/*.jpg)" || echo "$rep"; done < <(find /volume1/video/movies -type d ! -name '*Saga*' -print0)


 
Résultat :
 
 

Code :
  1. /volume1/video/movies
  2. /volume1/video/movies/Death Note (2017)/@eaDir/Death Note (2017)-poster.jpg
  3. /volume1/video/movies/Death Note (2017)/@eaDir/Death Note (2017)-fanart.jpg
  4. /volume1/video/movies/Nymphomaniac - Saga (2014)/Nymphomaniac - Volume 2 (2013)
  5. /volume1/video/movies/Stars 80 - Saga (2012-2017)/Stars 80 (2012)
  6. /volume1/video/movies/Transformers Collection (2007-2017)
  7. /volume1/video/movies/La Momie - Saga (1999-2008)/La Momie (1999)
  8. /volume1/video/movies/Le Gendarme de Saint-Tropez (1964-1982)
  9. /volume1/video/movies/Jean-Claude Van Damme
  10. /volume1/video/movies/Pagnol, Souvenirs d'enfance (1990-2007)
  11. /volume1/video/movies/The Amazing Spider-Man Collection (2012-2014)
  12. /volume1/video/movies/Spider-Man (Avengers) Collection (2017-2019)
  13. /volume1/video/movies/Captain Marvel Collection (2019)
  14. /volume1/video/movies/Death Note - Saga (2008-2016)/Death Note (2006)/@eaDir/logo.png



---------------
« A l’origine de toute erreur attribuée à l’ordinateur, vous trouverez au moins deux erreurs humaines. Dont celle consistant à attribuer l’erreur à l’ordinateur. »
n°1439435
kajoux
Posté le 24-10-2019 à 11:45:40  profilanswer
 

Oui, c'est bien ce à quoi je m'attendais : regarde bien les résultats, aucun répertoire contenant "Saga" n'est listé.
Seuls des chemins contenant "Saga" sont listés.
Et c'est exactement ce que tu as demandé plus haut : si un répertoire contient "Saga" dans son nom, alors ne pas le lister, mais, prendre en compte les répertoires qu'il contient.
 
Ici, on a par exemple la ligne :

/volume1/video/movies/Nymphomaniac - Saga (2014)/Nymphomaniac - Volume 2 (2013)


dans lequel le chemin est

/volume1/video/movies/Nymphomaniac - Saga (2014)/


et le (nom du) répertoire est

Nymphomaniac - Volume 2 (2013)


La commande n'a pas listé le répertoire « Nymphomaniac - Saga (2014) », mais elle a bien effectué la recherche dedans, et elle a trouvé le répertoire « Nymphomaniac - Volume 2 (2013) », qui ne doit donc pas contenir de fichier en .jpg
Je ne sais pas si le répertoire « Nymphomaniac - Saga (2014) » contient ou non des fichiers en .jpg, mais si tel est le cas, tu peux faire le test de les déplacer ailleurs temporairement et de relancer la commande : elle ne listera pas ce répertoire, alors qu'il ne contient plus de fichiers en .jpg, mais continuera à effectuer la recherche dedans.
 
Tous tes autres cas contenant "Saga" sont du même type  ;)


Message édité par kajoux le 24-10-2019 à 11:47:25
n°1439450
snowden
Posté le 24-10-2019 à 17:37:20  profilanswer
 

Ahhhhh oui en effet, tu as entièrement raison. Je n'avais pas vu ça comme ça.
 
Merci beaucoup pour ton aide et tes explications ;)


---------------
« A l’origine de toute erreur attribuée à l’ordinateur, vous trouverez au moins deux erreurs humaines. Dont celle consistant à attribuer l’erreur à l’ordinateur. »
n°1439451
kajoux
Posté le 24-10-2019 à 18:32:32  profilanswer
 

De rien, par contre je me rends compte, en regardant un peu mieux ton retour de commande ci-dessus, que tu peux avoir des répertoires dont le nom est en .jpg, comme par exemple

/volume1/video/movies/Death Note (2017)/@eaDir/Death Note (2017)-poster.jpg


Il s'agit nécessairement d'un répertoire, car sinon find ne l'aurait pas listé.
De même d'ailleurs que tu peux en avoir en .png plus bas :

/volume1/video/movies/Death Note - Saga (2008-2016)/Death Note (2006)/@eaDir/logo.png


C'est-à-dire qu'en gros, tu peux avoir des répertoires qui ont des noms de fichiers image : ça complique un peu la donne  :o  
Car la commande que je t'ai donnée ne s'attendait pas à ça  :D  
 
En effet, telle quelle, elle ne listera pas un répertoire contenant un ou plusieurs sous-répertoires dont les noms sont en .jpg, mais ne contenant pas de fichiers en .jpg, ce qui n'est probablement pas ce que tu veux.
Il faudrait donc distinguer entre fichiers et répertoires au niveau du test dans le while, et cela pour chaque nom en .jpg trouvé.
Ça va devenir un peu lourd sur une ligne, mais voilà ce que ça donnerait :

shopt -s nullglob && while IFS='' read -r -d '' rep; do test "$(for name in "$rep"/*.jpg; do test -f "$name" && echo "$name" && break; done)" || echo "$rep"; done < <(find /volume1/video/movies -type d ! -name '*Saga*' -print0)


Message édité par kajoux le 24-10-2019 à 18:53:58
n°1439461
snowden
Posté le 24-10-2019 à 20:54:37  profilanswer
 

Bah en faite, les répertoires @eaDir sont supprimés via une tâche CRON une fois par jour.
 
Là malheureusement, j'avais pas encore lancé mon script pour sa première utilisation...
 
Merci pour ta dernière commande ;)


---------------
« A l’origine de toute erreur attribuée à l’ordinateur, vous trouverez au moins deux erreurs humaines. Dont celle consistant à attribuer l’erreur à l’ordinateur. »

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  Lister répertoires ne contenant pas un type de fichier ?

 

Sujets relatifs
Astuce : duplication de la sortie standard vers fichier de log[Bash] Formatage de fichier
Remplacer date dans nom fichiersystemd, fichier service qui change tout seul ???
[PYTHON2] Lire une liste dans un fichierPerte d'un fichier xls juste ouvert avec Libre Office
Accès 'denied' à un fichier dont je suis propriétaireecrasement de fichier sur une memoire flash .
Solution libre de type Teamviewer ? 
Plus de sujets relatifs à : Lister répertoires ne contenant pas un type de fichier ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR