Améliorer la présentation de la sortie de "find"

bonjour ,

en cherchant à séparer répertoires et fichiers dans l’affichage du contenu d’un répertoire j’ai fabriqué une commande qui fonctionne bien mais qui me donne une présentation un peu lourde pour les fichiers avec un (./) ( = répertoire courant ? ) systématiquement présent et qui ne m’apporte rien , du moins il me semble . Est-il possible de modifier cette commande pour supprimer ce ./ du début ?

mm@Xfce:~$ find  -maxdepth 1  -type f  ; (find  -maxdepth 1  -type f)| wc -l ; ls -d */ ; (ls -d */) | wc -l
./.ICEauthority
./.bash_aliases
./.lesshst
etc ...
13
Bureau/     Images/   Musique/  Public/           Vidéos/
Documents/  Modèles/  PDF/      Téléchargements/
9

ps : à moins qu’une autre commande plus simple puisse faire l’affaire .

Tu peux regarder une fonction de ce genre:

lsfd() { i=0 ; j=0
  while read L ;do basename $L;((i++));done < <(find -maxdepth 1 -type f |sort)
  echo "● Nombre de fichiers: $i"
  while read L ;do echo $L;((j++));done < <(find -maxdepth 1 -type d |sort)
  echo "● Nombre de répertoires: $j"
}

j’ai donc enregistré ce que tu proposes dans un fichier test que j’ai rendu exécutable puis lancé :

mm@Xfce:~$ ls -l test
-rwxr--r-- 1 mm mm 273 13 nov.  09:10 test
mm@Xfce:~$ test

sans succès apparemment . Qu’est-ce que j’ai oublié de faire ?

note : je ne connais pas encore la commande interne while

1 - tu fais un copier/coller du bloc entier de la fonction lsfd dans ton terminal
2 - tu exécutes la commande lsfd
C’est tout.

j’ai cru que c’était un fichier shell !!

donc voilà le résultat :

mm@Xfce:~$ lsfd
.bash_aliases
.bash_history
.bash_logout
.bashrc
.dmrc
.ICEauthority
.lesshst
.profile
test
.test.swp
.viminfo
.wget-hsts
.Xauthority
.xsession-errors
.xsession-errors.old
● Nombre de fichiers: 15
.
./Bureau
./.cache
./.config
./.cups
./.dbus
./Documents
./.gnupg
./.googleearth
./Images
./.local
./Modèles
./.mozilla
./.mozilla_sauv_28_10_22
./Musique
./PDF
./.pki
./Public
./.sane
./.ssh
./Téléchargements
./.themes
./.thunderbird
./.thunderbird_sauv_28_10_22
./Vidéos
● Nombre de répertoires: 25

ça fonctionne bien pour les fichiers mais nettement moins bien pour les répertoires . Je vais donc essayer de faire un genre de mix en utilisant ma commande pour les répertoires .

Ta terminologie est très vague.
exemple: ‹ ./.cache › est un répertoire, certes caché, mais un répertoire.
.viminfo est un fichier caché, et tu ne dis pas que ça ne ‹ fonctionne pas › ou ‹ mal ›.

Tu dois donc clarifier si tu souhaites afficher/compter les fichiers/répertoires ‹ cachés ›
―――――――――――――
Tu peux réessayer ça:

lsfd() { i=0 ; j=0
  while read L ;do basename $L;((i++));done < <(find -maxdepth 1 -type f |sort)
  printf  "● Nombre de fichiers: $i\n\n"
  while read L ;do printf "$L ";((j++));done < <(/usr/bin/ls -d */)
  printf  "\n● Nombre de répertoires: $j\n"
}

je voudrais juste retrouver les deux listes que j’ai données dans mon 1er message mais sans les ( ./ ) dans la liste des fichiers . Je vais essayer de combiner la 1ère partie de ta commande avec la 2ème partie de la mienne . Ça devrait le faire je pense .

Ça a marché . Avec un alias ça devrait être facilement exploitable .

Merci pour le coup de main .

Il me reste à essayer de comprendre ta commande .

suite :

Tu peux réessayer ça:

effectivement ça marche bien . Ma solution qui combine les deux parties de commande a pour elle de mettre de la couleur pour les répertoires . Donc je vais voir ce que je retiens .

Merci bien .

suite:

Ta terminologie est très vague.

effectivement et je viens d’en prendre conscience en utilisant ls -A au lieu dels car je n’avais pas vraiment réalisé que , par exemple, .thunderbird était un répertoire , je l’avais toujours considéré comme un dossier . Idem pour les autres , inconsciemment d’ailleurs , sans y avoir réfléchi . Et " find -type d " que tu utilises finit de m’en convaincre . De toute façon j’aurais buté sur ce problème dans un 2ème temps car il me fallait bien tenir compte des ces « dossiers » cachés . Même si théoriquement je vois bien la différence entre un "répertoire"et un « dossier » , pratiquement et à l’évidence ça me pose un problème car même debian les considère comme des dossiers ( cf « propriétés » ) . Mais comme aucune option pour ls ou find n’a l’air d’exister pour les dossiers , j’allais buter sur ce point précis … ?

Remarque: attention à la commande ls qui peut-être soit la commande ls, ou un alias.
C’est la raison de l’usage du /usr/bin/ls au lieu de ls du bloc ci-dessus pour garantir un résultat attendu.
Voir type ls

Une fois satisfait, tu copies/colles le bloc fonction dans ton fichier ‹ .bashrc › , et tu auras la fonction ‹ lsfd › disponible à chaque session.

La coloration de ls ne te suffit pas pour ça ? Combiné à ls --group-directories-first peut-être ?

cette commande me donne presque ce que je désire à des fins de comparaison rapide entre mon portable et un ssd externe qui me sert de debian nomade et de sauvegarde . Mais elle sera facile à personnaliser … à condition que j’arrive à séparer physiquepent les 2 groupes . Merci .

Affichées côte à côte sur un même écran d’ordinateur si les listes sont séparées je vois tout de suite les différences éventuelles et pas seulement pour ce répertoire personnel .

Bonjour

Il manquait une paire de guillemets,
ce qui donnerait :

lsfd() { i=0 ; j=0
  while read L ;do basename "$L";((i++));done < <(find -maxdepth 1 -type f |sort)
  printf  "● Nombre de fichiers: $i\n\n"
  while read L ;do printf "$L ";((j++));done < <(/usr/bin/ls -d */)
  printf  "\n● Nombre de répertoires: $j\n"
}

Il faudra trouver un autre nom que lsfd

diff -r ou rsync --dry-run peut aussi t’aider à trouver des différences entre deux arborescences.

Je n’avais pas pensé à cette solution qui implique que je branche mon ssd nomade sur mon portable . Sinon avant je passais par le protocole ssh après avoir mis debian à jour , toujours avec ssh .

Donc je viens de tester cette commande diff -r que je ne connaissais pas avec cette option ( -r ): ça marche très bien .

Merci .

j’ai adapté ta fonction pour séparer les répertoires cachés du reste afin d’obtenir une meilleure lisibilité :

lsfd() { i=0 ; j=0 ; k=0 ; 
while read L ;do basename $L;((i++));done < <(find -maxdepth 1 -type f |sort);   printf  "● Nombre de fichiers: $i\n\n"; 
while read L ;do printf "$L ";((j++));done < <(/usr/bin/ls -d */);   printf  "\n● Nombre de répertoires: $j\n" 
while read L ;do basename $L;((k++));done < <(find -maxdepth 1 -type d -name '.*' | sort); echo "● Nombre de répertoires cachés: $k" ;  }

j’espère que ça n’est pas trop bancal ; en tout cas ça fonctionne et j’ai scindé en 3 parties distinctes la sortie de find en me débarrassant des préfixes (?) ou peut-être du « chemin » (?) ( ./ ) .

Donc ta fonction utilisée en complément de diff -r , selon la configuration matérielle utilisée , va me simplifier les comparaisons de listes .

question pratique subsidiaire : je viens de corriger une faute ( ajout d’un simple « r » ) et cela a provoqué une remontée de cette file . Peut-on éviter cette remontée si on la juge inutile ?

Et pourquoi pas 4 pendant qu’on y est: fichiers/répertoires cachés ou non.
Une variante pour investigation:

lsrep() { i=0 ; j=0 ; k=0 ; l=0 ; echo > ${T:=/tmp/lsrep}
  while read L ; do
   [[ -f $L && ! $L =~ ^\. ]] && echo "1$L" >> $T && ((i++))
   [[ -f $L && $L =~ ^\. ]]   && echo "2$L" >> $T && ((j++))
   [[ -d $L && ! $L =~ ^\. ]] && echo "3$L" >> $T && ((k++)) 
   [[ -d $L && $L =~ ^\. ]]   && echo "4$L" >> $T && ((l++))
  done < <(ls -A1)
  ((i > 0)) && sed -n '/^1/{s/.//;p}'  $T && printf "\e[32m● Nombre de fichiers: $i\e[m\n\n"
  ((j > 0)) && sed -n '/^2/{s/.//;p}'  $T && printf "\e[32m● Nombre de fichiers cachés: $j\e[m\n\n"
  ((k > 0)) && sed -n '/^3/{s/./ /;p}' $T |tr -d '\n' && printf "\n\e[34m● Nombre de répertoires: $k\e[m\n\n"
  ((l > 0)) && sed -n '/^4/{s/.//;p}'  $T && printf "\e[34m● Nombre de répertoires cachés: $l\e[m\n"
  printf "―――――――――――\nEn Synthèse: F= $i ~ Fc= $j | D= $k ~ Dc= $l\n"
}

Edit: exclusion des liens symboliques.

heureusement que tu le précises car j’aurais pu chercher longtemps ce que faisait cette fonction .

Je pense que je vais en rester à 3 niveaux en cherchant plutôt à améliorer la lisibilité de la sortie tout en pouvant facilement modifier la présentation : l’usage le dira .

J’essaie ceci sur un niveau ( le 2 ) . C’est certainement du bricolage mais même si ça ne doit pas être techniquement très au point , ça fonctionne plutôt bien . J’ai aussi tenu compte de la remarque de @MicP pour choisir un nom :

comp() { i=0 ; j=0 ; k=0 ;
 while read L ;do basename $L;((i++));done < <(find -maxdepth 1 -type f |sort);   printf  "\n● Nombre de fichiers: $i\n\n";
 while read L ;do printf "";((j++));done < <(/usr/bin/ls -d */) ;( ls -d */) | pr -2t -w110 ;   printf  "\n● Nombre de répertoires: $j\n\n"
 while read L ;do basename $L;((k++));done < <(find -maxdepth 1 -type d -name '.*' | sort); printf "\n● Nombre de répertoires cachés: $k\n" ;  }

note 1 : à terme je vais chercher à automatiser cette recherche lorsque mon ssd est branché sur une autre machine , sinon diff -r convient très bien , avec quelque chose du genre :
ssh …ssd… find > fichier …"cat fichier … " | diff etc … En attendant je reste avec ma méthode qui marche plutôt bien et qui me permet de tester . Mais je n’aime pas trop la présentation de la sortie de diff .

note 2 : si je supprime la première redirection de " < <(find … je ne vois aucun changement dans la sortie . Quel est son rôle ?

Bonjour

Pour voir ce que ça donne, créé un fichier ou et un répertoire nommé, par exemple :

"Capture d'ecran_2021-03-13_07-51-47.png"

dans le répertoire qui va être listé par ta fonction comp et lance la fonction.

bonjour ,

en utilisant mon répertoire Images je vois déjà que même avec ( < < ) les espaces vides et la présence de ( de ) dans les noms de fichier posent problème :

mm@Xfce:~/Images$ comp
Capture = arrêt à l'espace vide
remède =  _

basename: opérande supplémentaire « de »
Saisissez « basename --help » pour plus d'informations.  ==>  Capture d’écran de 2021-10-14 14-03-34.png
remède = _

maintenant je vais voir pour l’effet de l’absence de la redirection n°1

note : ces noms sont un peu anciens car j’ai pris l’habitude de ne plus laisser d’espace vide

pour ce qui est de l’effet de l’absence de ( < ) je ne vois pas :

mm@Xfce:~/Images/cap$ comp  ( un seul < en <(find...)
Capture  = arrêt à l'espace vide

● Nombre de fichiers: 1

/usr/bin/ls: impossible d'accéder à '*/': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à '*/': Aucun fichier ou dossier de ce type

● Nombre de répertoires: 0

.

● Nombre de répertoires cachés: 1

mm@Xfce:~/Images/cap$ comp   ( avec les deux < )
Capture  = idem ci-dessus

● Nombre de fichiers: 1

/usr/bin/ls: impossible d'accéder à '*/': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à '*/': Aucun fichier ou dossier de ce type

● Nombre de répertoires: 0

.

● Nombre de répertoires cachés: 1

Voir mon message #11