183 votes

Intersection de deux listes dans Bash

J'essaie d'écrire un script simple qui listera le contenu de deux listes. Pour simplifier, utilisons ls comme exemple. Imaginez "un" et "deux" sont des répertoires.

one = `ls one`
deux = `ls deux`
intersection $ un $ deux

Je suis toujours assez verte en bash, alors n'hésitez pas à corriger comment je fais cela. J'ai juste besoin d'une commande qui va imprimer tous les fichiers en "un" et "deux". Ils doivent exister dans les deux. Vous pourriez appeler cela "l'intersection" entre "un" et "deux".

317voto

ghostdog74 Points 86060
comm -12  <(ls 1) <(ls 2)

74voto

Solution avec comm

comm c'est bien, mais en effet besoin de travailler avec une liste triée. Et heureusement, ici, nous utilisons ls qui, à partir d' ls page de manuel de Bash

Trier les entrées par ordre alphabétique si aucun de cftuSUX ni-en quelque sorte.

comm -12  <(ls one) <(ls two)

Alternative avec sort

Intersection de deux listes:

sort <(ls one) <(ls two) | uniq -d

Complément de deux listes:

sort <(ls one) <(ls two) | uniq -u

Bonus

Jouer avec elle ;)

cd $(mktemp -d) && mkdir {one,two} && touch {one,two}/file_{1,2}{0..9} && touch two/file_3{0..9}

31voto

DVK Points 63282

Utilisez la commande comm :

 ls one | sort > /tmp/one_list
ls two | sort > /tmp/two_list
comm -12 /tmp/one_list /tmp/two_list
 

"trier" n'est pas vraiment nécessaire mais je l'inclue toujours avant d'utiliser "comm" au cas où.

6voto

BASH FAQ entrée # 36

3voto

Benubird Points 2337

Une alternative moins efficace (que comm):

 cat <(ls 1 | sort -u) <(ls 2 | sort -u) | uniq -d
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X