Résolu le 20-07-22 Je ne trouve pas comment utiliser la commande find

Postez ici vos scripts Bash, Python, etc.
Avatar du membre
tioker
modérateur
Messages : 982
Enregistré le : sam. 6 mai 2017 00:33
Localisation : Anjou...Feu !
Contact :

Je ne trouve pas comment utiliser la commande find

Message par tioker »

Bonsoir,
Mon titre est pour rire (trouver ~ find). :lol:
Mais mon sujet est sérieux.
Je veux connaitre l'arborescence des répertoires qui se trouvent à partir d'un point nommé.
Pas de soucis, la commande find est faite pour ça (cas en variable ou en texte).

Code : Tout sélectionner

ListDirectories=$(find $PWD -type d)
ListDirectories=$(find '/home/patrick/Images/Divers/GooglePhotos/album' -type d)
Mais si mon répertoire d'origine comporte des espaces (1), les deux commandes précédentes répondent différemment. Celle-ci fonctionne

Code : Tout sélectionner

ListDirectories=$(find '/home/patrick/Images/Divers/GooglePhotos/album/Terra Botanica (07' -type d)
alors que celle-ci non

Code : Tout sélectionner

P1="/home/patrick/Images/Divers/GooglePhotos/album/Terra Botanica (07"
ListDirectories=$(find $P1 -type d)
find: ‘/home/patrick/Images/Divers/GooglePhotos/album/Terra’: Aucun fichier ou dossier de ce type
find: ‘Botanica’: Aucun fichier ou dossier de ce type
find: ‘(07’: Aucun fichier ou dossier de ce type
J'ai beau convertir le P1 en mettant le caractère d'échappement du style

Code : Tout sélectionner

P1="${PWD// /\\ }"
echo $P1
/home/patrick/Images/Divers/GooglePhotos/album/Terra\ Botanica\ (07
ListDirectories=$(find $P1 -type d)
find: ‘/home/patrick/Images/Divers/GooglePhotos/album/Terra\\’: Aucun fichier ou dossier de ce type
find: ‘Botanica\\’: Aucun fichier ou dossier de ce type
find: ‘(07’: Aucun fichier ou dossier de ce type
Sans succès.

Une idée :idea:

(1) Dans la manipulation des liste j'avais réglé le problème et modifiant le paramètre de séparation IFS

Code : Tout sélectionner

IFS=$'\n'
Mais là ça ne sert à rien.
HP Victus 16: Mint 21.3 Cinnamon 6,0,4 + Windows 11 - Ryzen 5 5600H - NVIDIA GeForce GTX 1650 - Mem 16Go - SSD 512Go
pCloud Synchronisation en temps réel des 4 dossiers personnels

Avatar du membre
serged
Messages : 831
Enregistré le : jeu. 16 juil. 2015 07:59
Localisation : Montrouge (France)

Re: Je ne trouve pas comment utiliser la commande find

Message par serged »

Tu mets tes paramètres entre quote (") . Par exemple :

Code : Tout sélectionner

find "$PWD" -type d
LinuxMint Virginia 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)

Avatar du membre
tioker
modérateur
Messages : 982
Enregistré le : sam. 6 mai 2017 00:33
Localisation : Anjou...Feu !
Contact :

Re: Je ne trouve pas comment utiliser la commande find

Message par tioker »

serged a écrit :
dim. 17 juil. 2022 08:20
Tu mets tes paramètres entre quote (") . Par exemple :

Code : Tout sélectionner

find "$1" -type d
Merci Serged.
En fait j'avais déjà utilisé cette solution mais dans la masse de tests que j'avais faits j'ai du m'embrouiller.
Donc je suis reparti avec tes indications et voici le résultat.
Soit un script tout con:

Code : Tout sélectionner

#!/bin/bash
#
ListDirectories=$(find "$1" -type d)
echo $ListDirectories
Si mon argument 1 (que je récupère par avec $1) est un répertoire sans espace pas de soucis.
Mais si cet argument comporte des espaces, il faut absolument avoir des double quotes au lancement ET dans le script. Exemples

Code : Tout sélectionner

# le code suivant fonctionne si pwd ne comporte pas d'espace
bash $HOME/Téléchargements/find.sh $PWD
# mais il y a des espaces, il faut absolument lancer de cette manière
bash $HOME/Téléchargements/find.sh "$PWD"
Voilà. Il fallait le savoir (et tomber sur le cas).
Je vais pourvoir modifier en masse des fichiers dans les répertoires (et leur arborescence) que je veux traiter (dans mon cas diminuer drastiquement la tailles d'images pour libérer de la place).
Je continue à tester (si jamais je tombe sur un cas tordu et je mettrai à RÉSOLU ensuite.

Merci
HP Victus 16: Mint 21.3 Cinnamon 6,0,4 + Windows 11 - Ryzen 5 5600H - NVIDIA GeForce GTX 1650 - Mem 16Go - SSD 512Go
pCloud Synchronisation en temps réel des 4 dossiers personnels

Avatar du membre
cyrille
Administrateur du site
Messages : 12403
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Je ne trouve pas comment utiliser la commande find

Message par cyrille »

Hello Tioker, c'est dont on avait parlé , non ?
Tiens j'ai retrouvé ce guide
https://crust.ovh/site/IntroProgBash_2015-07-16.pdf

Jette un oeil aux pages 79, 80 ...

;)

Et je te mets également ce pdf, très bien fait :
https://crust.ovh/site/MSB_doc_compagnon.pdf

Bonne journée à toi ;)

++
Cyrille
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
NicNac
Messages : 102
Enregistré le : mer. 28 nov. 2018 15:31
Localisation : Gembloux Belgique

Re: Je ne trouve pas comment utiliser la commande find

Message par NicNac »

Intéressant le sujet.
Je voudrais aller plus compliquer peut-être.
J'ai un répertoire de photos mais dont un bon 1/4 sont en fait des doublons qui ne portent pas le même nom mais bien la même date.

Est-ce que je pourrais créer une ligne de commande pour éventuellement créer un fichier qui sauve le doublon, qu'ensuite l'utiliser comme entrée pour une routine de delete?
Desktop Mint 21.3 Virginia
i7-4770 24G Ram
NVIDIA GM107 [GeForce GTX 750 Ti]
HDD
- 1) SSD Linux Mint Mate Tessa Kernel: 5.15.0.101-generic
- 2) SSD Zindozs 10
- 3) HD HAIKU et le reste du backup
- 4) SSD 1To pour les photos et la musique
Wifi Ralink RT2561/RT61
LAN Realtek RTL8111/8168/8411

Avatar du membre
cyrille
Administrateur du site
Messages : 12403
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Je ne trouve pas comment utiliser la commande find

Message par cyrille »

Pas bien de s'inscustrer dans le message d'un autre. Pour la lisibilité, mieux vaut en creer un nouveau et citer celui là ...


M'enfin... Tu as de la chance, c'est le sujet de Tioker, ça m'étonnerait qu'il râle ;)

J'ai un répertoire de photos mais dont un bon 1/4 sont en fait des doublons qui ne portent pas le même nom mais bien la même date.
Le passerai par l'outil (exiftool, non installé par défaut) pour une recherche par date

Exemple d'utilisation

Code : Tout sélectionner

 exiftool -d %F -p '$Filename, $FileModifyDate, $DateTimeOriginal'  *.JPG
Donc toi c'est $DateTimeOriginal qui t'interesse


Sinon tu peux aussi passer par fdupes qui va rechercher les doublons non pas en se basant sur le nom mais en comparant la signature MD5 des fichiers suivie d'une comparaison octet à octet.
Option -d (pour delete) pour effacer les doublons

cf https://cbiot.fr/dokuwiki/fdupes
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
tioker
modérateur
Messages : 982
Enregistré le : sam. 6 mai 2017 00:33
Localisation : Anjou...Feu !
Contact :

Re: Je ne trouve pas comment utiliser la commande find

Message par tioker »

cyrille a écrit :
dim. 17 juil. 2022 10:47
Hello Tioker, c'est dont on avait parlé , non ?
...
++
Cyrille
Oui en effet, mais mon problème avait été résolu pour les listes dont les éléments comportaient des espaces (que j'ai résolu avec IFS) mais ensuite j'avais ce répertoire de tête qui me grattait à la racine (ou ce répertoire racine qui me grattait la tête).
Entre Serged et toi j'y suis arrivé.
NicNac a écrit :
dim. 17 juil. 2022 11:05
Intéressant le sujet.
Je voudrais aller plus compliquer peut-être.
J'ai un répertoire de photos mais dont un bon 1/4 sont en fait des doublons qui ne portent pas le même nom mais bien la même date.

Est-ce que je pourrais créer une ligne de commande pour éventuellement créer un fichier qui sauve le doublon, qu'ensuite l'utiliser comme entrée pour une routine de delete?
Je ne sais pas comment @Cyrille a pu deviner que je ne prendrais pas ombrage (c'est de circonstance) à ce qu'on vienne spoiler mon sujet...
Et pour autant j'ai cherché un peu pour trouver la commande (pour le fichier P1110161.JPG bien sûr...)

Code : Tout sélectionner

md5sum P1110161.JPG
Donc tu scrutes ton répertoire (en récurrent avec ma commande find), tu détermines si le fichier trouvé est une image, tu alimentes un fichier avec nom du fichier et le code md5, tu tries le fichier sur la colonne md5 et dès que y'a un doublon t'en fais ce que t'en veux.
Mais je pense que l'idée de Cyrille est sûrement meilleure que la mienne.

Sinon, KDO (script libre mais sans garantie...

Code : Tout sélectionner

#!/bin/bash
#
# Ce script scrute en récursif un répertoire P1 fourni au lancement.
# Il demande la taille maximum des fichiers (largeur ou hauteur)
# Il demande les extensions des fichiers à traiter (j'aurais pû sélectionner tous les fichiers type image...)
# Il boucle sur les types de fichiers (extension) sélectionnés
#	Il boucle sur les répertoires 
#		Il boucle sur les fichiers avec la bonne extension
#			Si ça dépasse, il convertit
# /!\ C'est une méthode bourrin, on convertit sans sauvegarder !!
# /!\ Le paramètre P1 au lancement doit être entouré de double quote (merci Cyrille et Serged)
# /!\ On utilise le détournement IFS pour gérer les séparateurs de listes (merci Cyrille)
# 
# Test si paramètre est un dossier
#
if [[ -z $@ ]]
then
	echo '-I- Paramètre non renseigné'
	exit
else
	if ! [[ -d $@ ]]
	then
		echo $@ '-I- n est pas un répertoire'
		exit
	fi 
fi
# Inquire
InputSize=`zenity --title "Choisir taille image" --text "Tailles" --list --radiolist --separator=" " --column="" --column="$txt_size" FALSE "1024" FALSE "1600" TRUE "1920" FALSE "3840" --height=220`
InputExtensions=`zenity --title "Type de fichier" --text "Tailles" --list --checklist --separator=" " --column="" --column="$txt_size" TRUE "png" TRUE "PNG" TRUE "JPG" TRUE "jpg" TRUE "JPEG" TRUE "jpeg" --height=220`
# Init
I=0
J=0
PreviousIFS=$IFS
# boucle sur les extensions
for Extension in $InputExtensions
do
	ListDirectories=$(find "$1" -type d)
	IFS=$'\n'
#	boucle sur les répertoires
	for Directory in $ListDirectories
	do
		IFS=$'\n'
#		boucle sur les fichiers avec la bonne extension dans chaque répertoire trouvé
		for File in $Directory/*.$Extension
		do
			if [[ -f $File ]]
			then
				IFS=$'\n'
				W=$(identify -format '%w' $File)
				H=$(identify -format '%h' $File)
#				Si la dimension de l'image est supérieure au max, on convertit
				if (($W > $InputSize || $H > $InputSize))
				then 
					echo '-I- Fichier ' $File ' largeur ' $W ' hauteur ' $H ' à convertir'
					I=$(($I+1))
					convert $File -resize "$InputSize"x"$InputSize" -quality 90 $File
				else
					echo '-I- Fichier ' $File ' largeur ' $W ' hauteur ' $H ' non éligible'
					J=$(($J+1))
				fi
			fi
		IFS=$PreviousIFS
		done
	IFS=$PreviousIFS
	done	
done
zenity --info --text="Fichiers convertis    : $I\nFichiers non éligibles: $J"
##
Et n'oubliez pas de mettre la bière au frais par ces fortes chaleurs 😓
Modifié en dernier par tioker le dim. 17 juil. 2022 18:03, modifié 1 fois.
HP Victus 16: Mint 21.3 Cinnamon 6,0,4 + Windows 11 - Ryzen 5 5600H - NVIDIA GeForce GTX 1650 - Mem 16Go - SSD 512Go
pCloud Synchronisation en temps réel des 4 dossiers personnels

Avatar du membre
cyrille
Administrateur du site
Messages : 12403
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Je ne trouve pas comment utiliser la commande find

Message par cyrille »

Merci pour le partage Tioker, je l'avais cherché sur ton git ;)
Bon ap midi ;)
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
tioker
modérateur
Messages : 982
Enregistré le : sam. 6 mai 2017 00:33
Localisation : Anjou...Feu !
Contact :

Re: Je ne trouve pas comment utiliser la commande find

Message par tioker »

cyrille a écrit :
dim. 17 juil. 2022 15:46
Merci pour le partage Tioker, je l'avais cherché sur ton git ;)
Bon ap midi ;)
Pour le git pourquoi pas (1).
Sinon j'ai modifié le script (plus haut) pour qu'il soit appelable dans Nautilus et que les compteurs soient affichés sous Zenity (car si on traite des fichiers par lot, le CPU chauffe... 🔥 ).

Sinon pour notre ami NicNac, une piste

Code : Tout sélectionner

MineType=$(file --mime-type P1100220.JPG | cut -d' ' -f2 | cut -d'/' -f1)
echo $MineType
image
(1) Je regarderais peut-être pour en mettre un lot dans mon git mais j'en ai pas mal qui ne sont pas de moi. Pour autant il suffit de regarder comment ils sont écrits et je retrouverais facilement ceux qui sont les plus bordéliques.
HP Victus 16: Mint 21.3 Cinnamon 6,0,4 + Windows 11 - Ryzen 5 5600H - NVIDIA GeForce GTX 1650 - Mem 16Go - SSD 512Go
pCloud Synchronisation en temps réel des 4 dossiers personnels

Avatar du membre
cyrille
Administrateur du site
Messages : 12403
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Je ne trouve pas comment utiliser la commande find

Message par cyrille »

pour NicNac : il faut qu'il utilise fdupes ;)
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Répondre