J'essaye d'écrire un script simple qui listera le contenu trouvé dans 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 encore assez vert en bash, alors n'hésitez pas à corriger ma façon de faire. J'ai juste besoin d'une commande qui imprimera tous les fichiers en "un" et "deux". Ils doivent exister dans les deux. Vous pourriez appeler cela «l'intersection» entre «un» et «deux».
Réponses:
la source
comm
jusqu'à aujourd'hui Cela vient de faire toute ma semaine :)comm
exige que les entrées soient triées. Dans ce cas,ls
trie automatiquement sa sortie, mais d'autres utilisations peuvent avoir besoin de le faire:comm -12 <(some-command | sort) <(some-other-command | sort)
public
méthodeerror()
fournie par un trait, en combinaison avecgit grep
, et c'était génial! J'ai couru$ comm -12 <(git grep -il "\$this->error(" -- "*.php") <(git grep -il "Dash_Api_Json_Response" -- "*.php")
et, heureusement, je me suis retrouvé avec le nom du fichier qui contenait le trait.Solution avec
comm
comm
est génial mais en effet besoin de travailler avec une liste triée. Et heureusement ici, nous utilisonsls
lequel de lals
page de manuel BashAlternative avec
sort
Intersection de deux listes:
différence symétrique de deux listes:
Prime
Joue avec ;)
la source
Utilisez la
comm
commande:"sort" n'est pas vraiment nécessaire mais je l'inclus toujours avant d'utiliser "comm" au cas où.
la source
Une alternative moins efficace (que comm):
la source
(ls 1; ls 2) | sort -u | uniq -d
.sort -u | uniq -d
ne fait rien, car le tri a supprimé les doublons avant qu'uniq ne commence à les rechercher. Je pense que vous n'avez pas compris ce que fait ma commande.cat <(ls 1 | sort -u) <(ls 2 | sort -u) | uniq -d
pour afficher quoi que ce soit non plus. Ma commande doit lire(ls 1; ls 2) | sort | uniq -d
, sans le-u
, pour afficher l'intersection de la liste. @ MikaëlMayer avait raison de dire que ma commande initiale était interrompue.ls
par autre chose, par exemplefind
. Votre solution ne le permet pas, car si l'une des commandes renvoie deux lignes identiques, elle la récupère comme un doublon. Le mien fonctionne même si l'utilisateur veut fairels 1/*
et comparer tous les fichiers dans les sous-répertoires. Sinon, oui, ça marche aussi. Il est possible que le mien soit spécifique à Bash.La jointure est une autre bonne option en fonction de l'entrée et de la sortie souhaitée
la source
Il y a une autre question de Stackoverflow "Intersection de tableau dans bash", qui est marquée comme une copie de ceci. Ce n'est pas tout à fait la même chose, à mon avis, car cette question parle de comparer deux tableaux bash, alors que cette question se concentre sur les fichiers bash. Une réponse en une ligne à l'autre question, qui est maintenant close, est la suivante:
L'utilitaire de communication effectue un tri alphanumérique, tandis que les réponses «Array intersection in bash» utilisent des nombres; d'où l'utilisation de "sort" et "sort -g".
la source