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 19/07/2016, à 16:29

gotcha5832

Find et exclude list

Bonjour à tous


Je développe un script de traitement d'image basé sur un find.
Mais je voudrais exclure certain fichier.
pour cela je pensais faire un fichier txt avec un nom de fichier par ligne puis dans mon script vérifier si le fichier est contenu dans le fichier

		find ./ \( -iname \*.jpg -o -iname \*.jpeg -o -iname \*.png \) -type f | sort -r |  while read image
		do
			file="/home/gotcha5832/script/exclude.txt"
			exclude=0
			while read -r line
			do
				if [ "$line" = "$image" ]
					then
					exclude=1
				fi
			done <"$file"

			if [ $exclude = 0 ]
			then
				[…]
				TraitementImage $resultat "$image"
			fi
		done
  1. voyez vous une meilleurs solution que lire le fichier ligne par ligne?

Dernière modification par gotcha5832 (Le 19/07/2016, à 16:43)

Hors ligne

#2 Le 19/07/2016, à 17:14

pingouinux

Re : Find et exclude list

Bonjour,
Tu peux essayer ceci, mais tu exécutes quand même un grep pour chaque fichier trouvé par find :

                find ./ \( -iname \*.jpg -o -iname \*.jpeg -o -iname \*.png \) -type f | sort -r |  while read image
                do
                        file="/home/gotcha5832/script/exclude.txt"

                        if ! grep -q "$image" "$file"
                        then
                                […]
                                TraitementImage $resultat "$image"
                        fi
                done

Ajouté :
Si tu testes que $image est une ligne complète de $file, remplace le grep par

                        if ! grep -q "^$image$" "$file"

Ajouté (2) :
Tu peux regarder aussi la commande comm :

comm -23 fichier_trié_1 fichier_trié_2

va lister les lignes du premier fichier qui ne sont pas dans le second.

Ou bien

comm -23 <(sort fichier1) <(sort fichier2)

Dernière modification par pingouinux (Le 19/07/2016, à 17:47)

Hors ligne

#3 Le 20/07/2016, à 00:35

Postmortem

Re : Find et exclude list

Salut,

Pour ne lire qu'une fois le fichier contenant les exclusions, on peut utiliser awk.
Le fichier des exclusions doit contenir sur chaque ligne le nom d'un fichier image exact avec son chemin.

Pour l'exemple, j'ai créé cette arbo :

$ ls -RF1 /tmp/test/Images
/tmp/test/Images:
rep 1/
rep 2/
rep 3/
rep 4/

/tmp/test/Images/rep 1:
sous rep/

/tmp/test/Images/rep 1/sous rep:
un fichier1.jpg
un fichier2.jpg
un fichier  3.jpg
un fichier.txt

/tmp/test/Images/rep 2:
sous rep/

/tmp/test/Images/rep 2/sous rep:
un fichier1.PNG
un fichier2.jpg
un fichier  3.jpg
un fichier.txt

/tmp/test/Images/rep 3:
sous rep/

/tmp/test/Images/rep 3/sous rep:
un fichier1.jpg
un fichier2.jpg
un fichier  3.jpg
un fichier.txt

/tmp/test/Images/rep 4:
sous rep/

/tmp/test/Images/rep 4/sous rep:
un fichier1.jpg
un fichier2.jpg
un fichier  3.jpg
un fichier.txt

Le fichier contenant la liste des exclusions :

$ cat /tmp/test/liste_exclusions.txt
/tmp/test/Images/rep 1/sous rep/un fichier1.jpg
/tmp/test/Images/rep 2/sous rep/un fichier2.jpg
/tmp/test/Images/rep 3/sous rep/un fichier  3.jpg

Et on fait comme ça :

rep_images=/tmp/test/Images
liste_exclusions=/tmp/test/liste_exclusions.txt
while read -r image
do
   echo "Traitement de $image"
done < <(awk 'NR==FNR {i[$0]=1; next} !i[$0]' "$liste_exclusions" <(find "$rep_images" \( -iname '*.jpg' -o -iname '*.png' \) -type f))

Ce qui donne :

Traitement de /tmp/test/Images/rep 2/sous rep/un fichier  3.jpg
Traitement de /tmp/test/Images/rep 2/sous rep/un fichier1.PNG
Traitement de /tmp/test/Images/rep 1/sous rep/un fichier  3.jpg
Traitement de /tmp/test/Images/rep 1/sous rep/un fichier2.jpg
Traitement de /tmp/test/Images/rep 3/sous rep/un fichier1.jpg
Traitement de /tmp/test/Images/rep 3/sous rep/un fichier2.jpg
Traitement de /tmp/test/Images/rep 4/sous rep/un fichier  3.jpg
Traitement de /tmp/test/Images/rep 4/sous rep/un fichier1.jpg
Traitement de /tmp/test/Images/rep 4/sous rep/un fichier2.jpg

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#4 Le 20/07/2016, à 10:19

credenhill

Re : Find et exclude list

hello
et avec ?

find ./ \( -iname \*.jpg -o -iname \*.jpeg -o -iname \*.png \) -type f | grep -vf /home/gotcha5832/script/exclude.txt | while read ....

Dernière modification par credenhill (Le 20/07/2016, à 10:20)

Hors ligne

#5 Le 20/07/2016, à 11:13

MicP

Re : Find et exclude list

bonjour gotcha5832 pingouinux Postmortem et credenhill

Mon idée est plutôt d'utiliser la liste des fichiers à exclure pour les déplacer, le temps du traitement,
dans un répertoire temporaire de façon à ce qu'ils soient hors d'atteinte du travail effectué par la commande find.

Un déplacement de fichier ne coûte rien en terme de travail car ce n'est pas le contenu du fichier qui est déplacé tant qu'il reste dans le même système de fichiers,
et ce sera bien plus rapide qu'un test comparatif sur chaque fichier que find aura trouvé.

Comme dans cette liste des fichiers à déplacer, il se peut qu'il y ait des homonymes,
le N° de ligne dans la liste des fichiers à exclure pourrait être utilisée pour leur donner un nom temporaire
qui sera donc unique dans le répertoire de déplacement temporaire choisit,
et qui permettra de les remettre en place en utilisant ce N° de ligne.

Une fois les fichiers déplacés, find pourra travailler tranquille.

Et une fois le travail de find terminé, la liste des fichiers à exclure pourra être utilisée pour remettre en place les fichiers qui avaient été déplacés.

Éventuellement, un simple renommage de l'extension du ficher pourrait suffire si find ne doit trouver que des fichiers ayant une extension spécifique.

Dernière modification par MicP (Le 20/07/2016, à 11:22)

Hors ligne

#6 Le 21/07/2016, à 09:07

Postmortem

Re : Find et exclude list

Salut MicP,
C'est pas couillon ça !


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#7 Le 21/07/2016, à 10:59

MicP

Re : Find et exclude list

Je disais "déplacer", mais changer temporairement le nom d'extension des fichiers à exclure peut peut-être suffire.

Hors ligne