#1 Le 29/08/2020, à 14:44
- Akatu
Comparer les fichiers de 2 dossiers sans tenir compte de leurs extens.
Bonjour,
J'ai un dossier A qui contient des icônes ayant comme extensions .png
Le dossier B contient des icônes ayant des extensions .png et .webp
J'ai un écart de 1 fichier entre les deux et je cherche à savoir lequel manque. Je cherche en vain (pour le moment) une commande permettant de faire un diff mais sans prendre en compte les extensions.
Par exemple, le fichier coucou.png dans le dossier A doit être considéré comme égal au fichier coucou.webp dans le dossier B.
Merci d'avance pour votre aide.
KDE neon User Edition
LENOVO Ideapad L340-15IRH
Intel(R) Core(TM) i5-9300H CPU @ 2.40GHz (8 coeurs)
512 Go SSD - (M.2 2280) PCIe 3.0 x4 - NVM Express (NVMe)
Hors ligne
#2 Le 29/08/2020, à 14:58
- sputnick
Re : Comparer les fichiers de 2 dossiers sans tenir compte de leurs extens.
Salut:
diff -aqr A B
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
https://sputnick.fr
Hors ligne
#3 Le 29/08/2020, à 15:01
- Akatu
Re : Comparer les fichiers de 2 dossiers sans tenir compte de leurs extens.
KDE neon User Edition
LENOVO Ideapad L340-15IRH
Intel(R) Core(TM) i5-9300H CPU @ 2.40GHz (8 coeurs)
512 Go SSD - (M.2 2280) PCIe 3.0 x4 - NVM Express (NVMe)
Hors ligne
#4 Le 29/08/2020, à 15:02
- sputnick
Re : Comparer les fichiers de 2 dossiers sans tenir compte de leurs extens.
En lisant mieux:
#!/bin/bash
for i in A/*.*; do
file="${i##*/}"
compgen -G "B/${file%.*}"* &>/dev/null || echo "B/${file%.*} manquant"
done
Dernière modification par sputnick (Le 29/08/2020, à 15:06)
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
https://sputnick.fr
Hors ligne
#5 Le 29/08/2020, à 15:08
- Akatu
Hors ligne
#6 Le 29/08/2020, à 15:18
- sputnick
Re : Comparer les fichiers de 2 dossiers sans tenir compte de leurs extens.
Autrement:
diff -a <(cd A; for i ; do printf "$i\n$i\n"; done | cut -d'.' -f1) <(cd B; printf '%s\n' * | cut -d'.' -f1)
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
https://sputnick.fr
Hors ligne
#7 Le 29/08/2020, à 15:31
- Akatu
Re : Comparer les fichiers de 2 dossiers sans tenir compte de leurs extens.
ça me liste toujours 4 fichiers
$ diff -a <(cd /home/arnaud/Téléchargements/Temp/1/; for i ; do printf "$i\n$i\n"; done | cut -d'.' -f1) <(cd /home/arnaud/Téléchargements/Temp/2/; printf '%s\n' * | cut -d'.' -f1)
0a1,4
> osheden_clock_hour_andropie
> osheden_clock_hour_azulox
> osheden_clock_hour_bestia
> osheden_clock_hour_blackarmydiamond
KDE neon User Edition
LENOVO Ideapad L340-15IRH
Intel(R) Core(TM) i5-9300H CPU @ 2.40GHz (8 coeurs)
512 Go SSD - (M.2 2280) PCIe 3.0 x4 - NVM Express (NVMe)
Hors ligne
#8 Le 29/08/2020, à 15:35
- Watael
Re : Comparer les fichiers de 2 dossiers sans tenir compte de leurs extens.
for f in A/*.jpg
do
fichier=${f##*/}
nom=${fichier%.*}
test -f "B/$nom.png" -o -f "B/$nom.webp" || echo "pas de \"$nom\" sous B/"
done
?
Dernière modification par Watael (Le 29/08/2020, à 16:08)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 29/08/2020, à 15:51
- Akatu
Re : Comparer les fichiers de 2 dossiers sans tenir compte de leurs extens.
$ ./script.sh
pas de "*" sous B/
Je ne comprends pas le .jpg en première ligne.
Dernière modification par Akatu (Le 29/08/2020, à 15:51)
KDE neon User Edition
LENOVO Ideapad L340-15IRH
Intel(R) Core(TM) i5-9300H CPU @ 2.40GHz (8 coeurs)
512 Go SSD - (M.2 2280) PCIe 3.0 x4 - NVM Express (NVMe)
Hors ligne
#10 Le 29/08/2020, à 15:56
- Watael
Re : Comparer les fichiers de 2 dossiers sans tenir compte de leurs extens.
c'est parce que je me suis trompé : il faut remplacer par png. bien sûr.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#11 Le 29/08/2020, à 15:57
- Akatu
Re : Comparer les fichiers de 2 dossiers sans tenir compte de leurs extens.
:-)
Résultat avec png :
pas de "osheden_clock_hour_azulox" sous B/
=> ce qui est faux
==> seul "osheden_clock_hour_blackarmydiamond" n'est présent que dans B
KDE neon User Edition
LENOVO Ideapad L340-15IRH
Intel(R) Core(TM) i5-9300H CPU @ 2.40GHz (8 coeurs)
512 Go SSD - (M.2 2280) PCIe 3.0 x4 - NVM Express (NVMe)
Hors ligne
#12 Le 29/08/2020, à 16:11
- Watael
Re : Comparer les fichiers de 2 dossiers sans tenir compte de leurs extens.
tu peux nous montrer la liste de chaque répertoire :
cd A; \ls -1; echo "==="; cd B; \ls -1
stp.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#13 Le 29/08/2020, à 16:27
- Akatu
Re : Comparer les fichiers de 2 dossiers sans tenir compte de leurs extens.
pas de problème, cela correspond à mes captures d'écran :
$ cd /home/arnaud/Téléchargements/Temp/1/; \ls -1; echo "==="; cd /home/arnaud/Téléchargements/Temp/2/; \ls -1
osheden_clock_hour_andropie.png
osheden_clock_hour_azulox.png
osheden_clock_hour_bestia.png
===
osheden_clock_hour_andropie.png
osheden_clock_hour_azulox.webp
osheden_clock_hour_bestia.png
osheden_clock_hour_blackarmydiamond.png
KDE neon User Edition
LENOVO Ideapad L340-15IRH
Intel(R) Core(TM) i5-9300H CPU @ 2.40GHz (8 coeurs)
512 Go SSD - (M.2 2280) PCIe 3.0 x4 - NVM Express (NVMe)
Hors ligne
#14 Le 29/08/2020, à 16:39
- Watael
Re : Comparer les fichiers de 2 dossiers sans tenir compte de leurs extens.
donc il serait préférable de chercher dans B/ les fichiers absent sous A/, non ?
et donc inverser la boucle : pour fichier dans B/, existe-t-il nom_fichier.png ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#15 Le 29/08/2020, à 17:39
- Akatu
Re : Comparer les fichiers de 2 dossiers sans tenir compte de leurs extens.
Je ne pense pas car dans ce cas, il y a un fichier en plus dans B mais demain il peut y en avoir 3 dans A.
Il faut que ça marche dans les 2 sens.
KDE neon User Edition
LENOVO Ideapad L340-15IRH
Intel(R) Core(TM) i5-9300H CPU @ 2.40GHz (8 coeurs)
512 Go SSD - (M.2 2280) PCIe 3.0 x4 - NVM Express (NVMe)
Hors ligne
#16 Le 29/08/2020, à 17:44
- Watael
Re : Comparer les fichiers de 2 dossiers sans tenir compte de leurs extens.
une seule boucle ne suffira pas, alors.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#17 Le 29/08/2020, à 18:08
- Watael
Re : Comparer les fichiers de 2 dossiers sans tenir compte de leurs extens.
edit : construction de tableaux
$ cd /tmp/A; A=( * ); cd /tmp/B; B=( * ); cd ~; A=( "${A[@]%.*}" ); B=( "${B[@]%.*}" ); printf '%s\n' "${A[@]}"; echo '==='; printf '%s\n' "${B[@]}"
osheden_clock_hour_andropie
osheden_clock_hour_azulox
osheden_clock_hour_bestia
osheden_clock_hour_byWatael
===
osheden_clock_hour_andropie
osheden_clock_hour_azulox
osheden_clock_hour_bestia
osheden_clock_hour_blackarmydiamond
edit: recherche des différences
$ for i in "${!A[@]}"; do a="${A[i]}"; for ii in "${B[@]}"; do b="${B[ii]}"; if test "$a" = "$b"; then unset 'A['$i']' B[$ii]; B=( "${B[@]}" ); break; fi; done; done; A=( "${A[@]}" ); printf '%s\n' "${A[@]}"; echo '==='; printf '%s\n' "${B[@]}"
osheden_clock_hour_byWatael
===
osheden_clock_hour_blackarmydiamond
Dernière modification par Watael (Le 30/08/2020, à 10:04)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#18 Le 29/08/2020, à 19:04
- kamaris
Re : Comparer les fichiers de 2 dossiers sans tenir compte de leurs extens.
Je n'ai pas tout bien lu, mais il me semble que ceci marcherait :
grep -vFxf <(printf '%s\n' A/* | sed -E 's%.*/|\.[^.]*%%g') <(printf '%s\n' B/* | sed -E 's%.*/|\.[^.]*%%g')
On peut inverser A et B pour avoir le résultat complémentaire.
On peut aussi mettre des caractères nuls comme séparateurs au lieu des sauts de ligne, si besoin (depuis printf jusqu'à grep, en passant par sed).
Dernière modification par kamaris (Le 29/08/2020, à 19:08)
Hors ligne
#19 Le 29/08/2020, à 19:45
- Akatu
Re : Comparer les fichiers de 2 dossiers sans tenir compte de leurs extens.
@Watael Je me pers dans les valeurs A/B et les variables A/B du coup, je ne sais pas où exactement je dois mettre les vrais chemins.
@kamaris En effet, cela fonctionne ! J'ai mis des variables pour remplacer A et B pour faciliter les futures utilisations.
Le chiant en moi aurait aimé savoir dans quel dossier le fichier manque (ou est en plus). Ça serait la cerise sur le gateau qui est déjà très bon :-)
Merci à tous.
KDE neon User Edition
LENOVO Ideapad L340-15IRH
Intel(R) Core(TM) i5-9300H CPU @ 2.40GHz (8 coeurs)
512 Go SSD - (M.2 2280) PCIe 3.0 x4 - NVM Express (NVMe)
Hors ligne
#20 Le 29/08/2020, à 19:57
- kamaris
Re : Comparer les fichiers de 2 dossiers sans tenir compte de leurs extens.
La commande ci-dessus liste les fichiers qui sont dans B mais pas dans A.
Donc selon dans quel ordre tu passes tes variables, tu sais qui est où.
Hors ligne
#21 Le 29/08/2020, à 20:24
- Watael
Re : Comparer les fichiers de 2 dossiers sans tenir compte de leurs extens.
les vrais chemins doivent remplacer /tmp/A et /tmp/B.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#22 Le 30/08/2020, à 08:07
- Akatu
Re : Comparer les fichiers de 2 dossiers sans tenir compte de leurs extens.
@kamaris Noté mais du coup, ça ne fait pas le contrôle dans les 2 sens, dommage.
@Watael Euh, il n'y a pas de "tmp" dans la commande. Désolé, je ne suis pas.
KDE neon User Edition
LENOVO Ideapad L340-15IRH
Intel(R) Core(TM) i5-9300H CPU @ 2.40GHz (8 coeurs)
512 Go SSD - (M.2 2280) PCIe 3.0 x4 - NVM Express (NVMe)
Hors ligne
#23 Le 30/08/2020, à 08:18
- kamaris
Re : Comparer les fichiers de 2 dossiers sans tenir compte de leurs extens.
Mais… qu'est-ce qui t'empêche d'inverser les rôles de A et B pour aller dans un sens ou dans l'autre ?
Et tu peux concaténer les deux commandes dans une fonction qui fait les deux sens, du type :
f() {
echo "Fichiers uniquement dans $1 :"
grep -vFxf <(printf '%s\n' "$2"/* | sed -E 's%.*/|\.[^.]*%%g') <(printf '%s\n' "$1"/* | sed -E 's%.*/|\.[^.]*%%g')
echo -e "\nFichiers uniquement dans $2 :"
grep -vFxf <(printf '%s\n' "$1"/* | sed -E 's%.*/|\.[^.]*%%g') <(printf '%s\n' "$2"/* | sed -E 's%.*/|\.[^.]*%%g')
}
que tu lances par
f A B
Hors ligne
#24 Le 30/08/2020, à 08:37
- Akatu
Re : Comparer les fichiers de 2 dossiers sans tenir compte de leurs extens.
Certes mais en lançant une seule commande, ça fait gagner du temps.
C'est parfait comme ça, merci encore !
Bonne journée.
KDE neon User Edition
LENOVO Ideapad L340-15IRH
Intel(R) Core(TM) i5-9300H CPU @ 2.40GHz (8 coeurs)
512 Go SSD - (M.2 2280) PCIe 3.0 x4 - NVM Express (NVMe)
Hors ligne
#25 Le 30/08/2020, à 10:03
- Watael
Re : Comparer les fichiers de 2 dossiers sans tenir compte de leurs extens.
il y en a deux (cd /tmp/...) dans la première partie du code; elle ne fait pas que montrer le contenu des répertoires, elle alimente deux tableaux, utilisés dans la deuxième partie.
Dernière modification par Watael (Le 30/08/2020, à 10:05)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne