Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 07/04/2021, à 08:34

Tawal

[Résolu] Tester si un Dossier est Vide de Données

Hello,

Je cherche un moyen simple de tester si un dossier est vide (de toutes données)

J'ai plusieurs solutions avec des commandes extérieures, avec find :

if [ -z "$(find   "$Doss"  -type f   ! -empty   -print   -quit)" ]
then
    echo "Dossier vide"
else
    echo "Dossier non vide"
fi

ou avec du :

taille=$(du "$Doss")
taille=${taille%%[[:blank:]]*}   # pour récupérer que la partie chiffrée en début de retour de 'du'

if [ "$taille" -eq 4 ]
then
    echo "Dossier vide"
else
    echo "Dossier non vide"
fi

Y-a-t-il une façon de faire plus simplement et avec des primitives de préférence ?

Merci.

Dernière modification par Tawal (Le 08/04/2021, à 17:38)


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

#2 Le 07/04/2021, à 09:07

bruno

Re : [Résolu] Tester si un Dossier est Vide de Données

Avec ls :

if [ "$(ls -A $dossier)" ]; then
     echo "dossier non vide"
else
    echo "dossier vide"
fi

Hors ligne

#3 Le 07/04/2021, à 09:53

Tawal

Re : [Résolu] Tester si un Dossier est Vide de Données

Oui, mais non pour au moins 3 raisons :

  1. Ne marche pas si un dossier vide est présent dans le dossier, ni si un fichier vide est présent

  2. C'est toujours une commande extérieure

  3. J'aime pas trop ls dans un script ...

La solution avec du est plus efficace sur le point 1 wink

Merci de la participation.


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

#4 Le 07/04/2021, à 10:41

MicP

Re : [Résolu] Tester si un Dossier est Vide de Données

Bonjour

michel@xubu:~/tstaeff$ shopt -s nullglob
michel@xubu:~/tstaeff$ mkdir rep
michel@xubu:~/tstaeff$ nbFichs=( rep/* ); test ${#nbFichs[@]} -eq 0 && echo "Vide" || echo "PAS vide"
Vide
michel@xubu:~/tstaeff$ touch rep/fich
michel@xubu:~/tstaeff$ nbFichs=( rep/* ); test ${#nbFichs[@]} -eq 0 && echo "Vide" || echo "PAS vide"
PAS vide
michel@xubu:~/tstaeff$ 

Dernière modification par MicP (Le 07/04/2021, à 10:43)

Hors ligne

#5 Le 07/04/2021, à 11:42

Tawal

Re : [Résolu] Tester si un Dossier est Vide de Données

Ah, ça avance smile
Et encore une fois, tu me montres un tableau MicP
Ça me plaît car c'est built-in.

Mais (oui, il y a un mais big_smile), il reste le souci de la présence de fichiers et dossiers vides.
Que je considère comme n'étant pas des données.

En gros, pour être plus clair :
Dossier vide (sans rien dedans) = Dossier vide
Dossier + Fichier vide = Dossier vide
Dossier + Dossier vide = Dossier vide
Avec toutes les récurrences possibles ...

du et find font très bien l'affaire (find permet de détecter les fichiers vides) mais je rechercherais plutôt une solution buit-in.

Merci encore.


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

#6 Le 07/04/2021, à 11:59

Watael

Re : [Résolu] Tester si un Dossier est Vide de Données

shopt -s nullglob dotglob

ATTENTION ! que les âmes sensibles s'abstiennent de lire la suite.
je préfère la solution avec ls.
c'est plus simple, et on ne parcourt pas la sortie : on teste simplement si la commande affiche quelque chose.


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#7 Le 07/04/2021, à 12:29

nany

Re : [Résolu] Tester si un Dossier est Vide de Données

Bonjour,


Watael a écrit :
shopt -s nullglob dotglob

ATTENTION ! que les âmes sensibles s'abstiennent de lire la suite.
je préfère la solution avec ls.
c'est plus simple, et on ne parcourt pas la sortie : on teste simplement si la commande affiche quelque chose.

Diantre ! Watael a changé son fusil d’épaule ! yikes

Ceci dit,

Tawal a écrit :

Ne marche pas si un dossier vide est présent dans le dossier, ni si un fichier vide est présent

Hors ligne

#8 Le 07/04/2021, à 12:38

Watael

Re : [Résolu] Tester si un Dossier est Vide de Données

la récursivité est assurée par find, et on peut ne pas préciser qu'on cherche uniquement les fichiers (-type f ).
find cherchera alors récursivement les fichiers, les dossiers...

on peut aussi demander à find de chercher strictement les fichiers ET les dossiers.


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#9 Le 07/04/2021, à 12:51

erresse

Re : [Résolu] Tester si un Dossier est Vide de Données

Bonjour,
À mon avis, c'est le postulat de départ qui est erroné car, si un répertoire est vide, il ne contient RIEN. S'il y a un fichier ou un sous-répertoire vides dans le répertoire testé, il n'est pas vide puisqu'il contient QUELQUE CHOSE.
Si tu veux t'assurer de l'absence de données (encore qu'un fichier même vide est une données en soi), il faut effectivement passer par un examen récursif du répertoire et le résultat devrait être nommé "absence de donnée significative" et non pas "dossier vide"...
Mais c'est juste mon avis et ça n'empêche de vouloir connaître cette information, bien sûr, et la recherche est toujours édifiante.
smile


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#10 Le 07/04/2021, à 13:13

nany

Re : [Résolu] Tester si un Dossier est Vide de Données

Watael a écrit :

la récursivité est assurée par find, et on peut ne pas préciser qu'on cherche uniquement les fichiers (-type f ).
find cherchera alors récursivement les fichiers, les dossiers...

on peut aussi demander à find de chercher strictement les fichiers ET les dossiers.

Yep, carrément.

Dans le cas précis (recherche de fichiers non-vides), voilà ce que j’ai trouvé de plus concis avec find :

[ $(find "$Doss" -type f ! -empty) ] && echo "présence de données significatives" || echo "absence de données significatives"

 
Ce qui équivaut à la première proposition de Tawal (-z, -print et -quit étant ici inutiles).

[edit]affichage de « présence » ou « absence de données significatives » après avoir lu la remarque d’erresse.[/edit]

Dernière modification par nany (Le 07/04/2021, à 13:16)

Hors ligne

#11 Le 07/04/2021, à 13:27

Tawal

Re : [Résolu] Tester si un Dossier est Vide de Données

@nany
Ta proposition paraît séduisante, mais (encore un mais, il fait @#!¿&? celui là lol)
Il faut le -print et le -quit sur de grosses arborescence, essaie de voir si /usr est vide avec ton test.


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

#12 Le 07/04/2021, à 13:33

nany

Re : [Résolu] Tester si un Dossier est Vide de Données

Alors seul le -quit devrait suffire (pourquoi afficher le résultat ?), non ?

[edit]Je viens de tester sur /usr, le -print est effectivement nécessaire aussi.[/edit]

Dernière modification par nany (Le 07/04/2021, à 13:36)

Hors ligne

#13 Le 07/04/2021, à 13:43

Tawal

Re : [Résolu] Tester si un Dossier est Vide de Données

@erresse
Oui d'accord pour l'ambiguïté.
J'ai changé le titre en conséquence wink
Merci.

@nany
Il faut aussi des guillemets " autour de la substitution de commande $(find ...).
Sinon, tu as un effet de "re-splitting" du retour si il y a des espaces ou autres caractères bizarres.
Et une erreur survient.

Edit: illustration

$ mkdir d
$ touch d/"The Fich"
$ [ $(find d -type f ! -empty -print -quit) ] && echo "Non Vide" || echo "Vide"
Vide
$ echo "Donnée" > "d/The Fich"
$ [ $(find d -type f ! -empty -print -quit) ] && echo "Non Vide" || echo "Vide"
bash: [: d/The : opérateur unaire attendu
Vide
$ [ "$(find d -type f ! -empty -print -quit)" ] && echo "Non Vide" || echo "Vide"
Non Vide
$

Dernière modification par Tawal (Le 07/04/2021, à 13:49)


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 07/04/2021, à 14:01

nany

Re : [Résolu] Tester si un Dossier est Vide de Données

Au temps pour moi. Il est vrai que j’ai perdu depuis longtemps l’habitude de nommer mes fichiers ou répertoires avec des espaces.

Donc, pour en revenir à ta première proposition, elle correcte à part peut-être le test -z.

Pour du, c’est peut-être plus rapide (il faudrait tester avec time).

Hors ligne

#15 Le 07/04/2021, à 14:17

Tawal

Re : [Résolu] Tester si un Dossier est Vide de Données

Pas besoin de time, la différence est très nette sur de grosse arborescence lourde.
find trouve tout de suite un fichier non vide ! (et quitte, arrête)
Tandis que du calcule la taille du dossier (et prend du temps pour ça).

Un plus pour find, il y a très peu de chance de tomber sur une très grosse arborescence avec que des fichiers et dossiers vides ...

Merci à vous pour ces avancements.
Je croyais sincèrement à une solution built-in simple.
On peut "simuler" find avec des globs et une boucle comprenant un test [ -s fichier ] ...

Edit: @nany
Oui, pas besoin du test -z wink

Dernière modification par Tawal (Le 07/04/2021, à 14:29)


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

#16 Le 07/04/2021, à 14:25

Zakhar

Re : [Résolu] Tester si un Dossier est Vide de Données

Tawal a écrit :

du et find font très bien l'affaire (find permet de détecter les fichiers vides) mais je rechercherais plutôt une solution buit-in.

Pourquoi cette "préférence" ?

Je comprends qu'il est possible que tu ne trouves pas le très standard du sur le système, ou une version amoindrie qui prétend être du mais n'a pas les bonnes options (busybox par ex).
Ce genre de farces m'est arrivé quand je tâchais de porter mes scripts sur Synology qui fonctionne à la base via busybox.

Mais d'un autre côté, ce qui est "built-in" va nécessairement dépendre du moteur de script utilisé.

Donc si tu espères avoir de "built-in" bash (ce qui est sans doute sous-entendu) pour traiter le cas d'exemple ci-dessus du Synology qui n'a pas un utilitaire donné... eh bien ça va rater parce que le ash du Synology n'a pas non plus les mêmes "built-ins"...

Enfin, il est vrai que lancer une commande externe = fork + lectures disque, mais grâce à la bonne gestion de la cache Linux, ce n'est guère visible et parfois plus rapide qu'une boucle de "built-ins" !

En option, tu peux aussi "protéger" tes scripts en testant si les commandes nécessaires existent au début du script. Sur bash tu as le builtin "type" qui fait ça.

Exemple :

$ type du ll find foo >/dev/null 2>&1 || { echo "One of the necessary commands do not exist"; exit; }
One of the necessary commands do not exist

En l'occurrence, la commande "foo" n'existe pas.
Avant cela, tu peux tester si "type" lui-même existe !

Dernière modification par Zakhar (Le 07/04/2021, à 14:37)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#17 Le 07/04/2021, à 14:36

Tawal

Re : [Résolu] Tester si un Dossier est Vide de Données

Pour te répondre brièvement :
Des solutions simples built-in remplaçant des commandes extérieures existent.
Par exemple, pour remplacer basename "$var", on peut utiliser "${var##*/}".
Dans ce genre de cas, oui je préfère le built-in.
Mais, (encore un mais P@#§!¿$? big_smile) dans le cas de ce topic, la solution commande externe me paraît plus appropriée.

Merci de ta remarque wink

Dernière modification par Tawal (Le 07/04/2021, à 14:37)


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

#18 Le 07/04/2021, à 14:40

Zakhar

Re : [Résolu] Tester si un Dossier est Vide de Données

Oui, ça dépend ce qu'on cherche !

Les built-in je limite, on parle en général de "bashisms", depuis que je me suis cassé les dents sur le Synology avec ash... et aussi depuis qu'Ubuntu est passé à dash en script par défaut !

Pour la "portabilité", les utilitaires GNU sont quand même mieux... si tu en disposes effectivement, parce que les équivalents "busybox" par exemple, c'est pas toujours la joie...

En l'occurrence pour ton énoncé, un bon du -s donne le résultat en une ligne ! big_smile

Il va marcher mieux que ls.

Exemple :

$ ls -l test/foo/bar 
-rw-rw-r-- 1 zakhar zakhar 1048576 avril  7 15:43 test/foo/bar
$ du test -s
0	test

Amusant non !..

En l'occurrence test/foo/bar est un fichier "sparse" obtenu avec un "touch" + un "truncate à 1M" (sur un filesystem qui gère les "sparse").
C'est donc un fichier de 1Mo qui est en fait vide, et prend en réalité zéro espace sur le disque en dehors des metadata.

Ton énoncé initial ne dit pas si tu considères un tel fichier de 1M comme vide ou pas... mais le ls standard ne montre pas la différence.
En fait il te faudrait faire un ls -s, pour montrer la taille allouée en bloc des fichiers:

$ ls -l test/foo/bar 
-rw-rw-r-- 1 zakhar zakhar 1048576 avril  7 15:43 test/foo/bar
$ ls -s test/foo/bar 
0 test/foo/bar

C'est bien un fichier de 1M qui occupe zéro bloc ! big_smile


Donc selon que ton énoncé compte les fichiers "sparse" vides comme du vide ou pas, tu es plus ou moins ennuyé !

Si tu comptes comme vide, tout va bien avec

du -s

Sinon tu peux toujours mettre

--apparent

, mais dans ce cas du va compter aussi la taille des répertoires !..

Dernière modification par Zakhar (Le 07/04/2021, à 14:56)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#19 Le 07/04/2021, à 14:59

Tawal

Re : [Résolu] Tester si un Dossier est Vide de Données

whaou ! Particularité que je ne connaissais pas ! Les fichiers "sparses" !

Et que dit find sur un tel fichier ?

Edit:
find -type f ! -empty trouve ce genre de fichier. Il n'est pas vide pour find

$ truncate -s 1M FichSparse
$ ls -ls
total 0
0 -rw-r--r-- 1 tawal tawal 1048576 avril  7 16:18 FichSparse
$ find . -type f ! -empty
./FichSparse
$

Dernière modification par Tawal (Le 07/04/2021, à 15:19)


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