2009-05-21 9 views
-1

Je dois gérer des listes avec find-command. Supposons que les listes ont des noms aléatoires dans des listes non distinctes (c'est-à-dire que leur intersection n'est pas vide). Comment puis-je faire:Union, Intersection et Exclure avec la commande FIND?

A \ B

trouver des fichiers dans la liste A l'exception des fichiers dans la liste B

Une intersection B

trouver les fichiers communs aux listes A et B

S'il vous plaît, consultez here.

Un syndicat B

trouver tous les fichiers dans les deux listes

EXEMPLES

$ find . | awk -F"/" '{ print $2 }' 

.zcompdump 
.zshrc 
.bashrc 
.emacs 

$ find ~/bin/FilesDvorak/.* -maxdepth 0 | awk -F"/" '{ print $6 }' 

.bashrc 
.emacs 
.gdbinit 
.git 

Je veux:

A \ B:

.zcompdump 
.zshrc 

A l'intersection B:

.bashrc 
.emacs 

A Union B:

.zcompdump 
.zshrc 
.bashrc 
.emacs 
.bashrc 
.emacs 
.gdbinit 
.git 

A essayer pour l'intersection

Lorsque j'enregistre les sorties des listes distinctes, je ne peux pas comprendre pourquoi la commande ne prend pas les choses communes, à savoir l'intersection ci-dessus:

find -f all_files -and -f right_files . 

Questions émergé de la question:

  1. trouver ~/bin/FilesDvorak /.* -maxdepth 0 ~ -et/.PAST_RC_files /.*

  2. S'il vous plaît, consulter pour trouver récursive Click here!

  3. trouver ~/bin/FilesDvorak /.* -maxdepth 0 -et liste

+0

3. REPONSE: comm -12 <(trouver: -maxdepth 1 | sed -e 's/^.\///') <(cat 1) –

+0

1. REPONSE: comm -12 <(trouver ~/bin/FilesDvorak /.* -maxdepth 0) <(find ~/.PAST_RC_files /.*) –

+0

J'ai supposé un inclusif et. –

Répondre

3

Sérieusement, c'est ce que comm (1) est pour.Je ne pense pas que la page de manuel pourrait être beaucoup plus claire: http://linux.die.net/man/1/comm

+0

@Dave: Quels mots-clés avez-vous utilisés pour trouver la commande? Je ne pouvais pas le trouver par les mots-clés: union, intersection, exclure et trouver. –

1

Il existe plusieurs outils qui peuvent vous aider à trouver l'intersection dans les listes de fichiers. 'trouver' n'en fait pas partie. Trouver est pour trouver des fichiers qui correspondent à un certain critère sur le système de fichiers.

Voici quelques façons de trouver votre réponse. Maintenant, vous avez

Pour générer vos deux listes de fichiers

find . -maxdepth 1 | sort > a 
(cd ~/bin/FilesDvorak/; find . -maxdepth 1 | sort > b) 

deux fichiers a et b qui contiennent des entrées d'annuaire sans récursion dans les sous-répertoires. (Pour supprimer le premier ./ vous pouvez ajouter un « sed -e « s /^./// » » ou votre première commande awk entre le trouver une sorte)

Pour l'Union

cat a b | sort -u 

pour trouver le A \ B

comm -23 a b 

pour trouver l'intersection

comm -12 a b 

pour plus d'informations 'homme comm' et 'homme trouver.

+0

@jabbie: Pourriez-vous donner un exemple concret de la façon dont vous utilisez comm? Je ne pouvais pas trouver une situation où je ne pouvais pas survivre avec vimdiff et sdiff seulement. –

+1

Comm est une commande très simple par rapport aux outils de diff. Comm fonctionne uniquement sur les fichiers triés lexicalement. Il compare les deux fichiers et vous indique les lignes qui existent seulement dans le premier fichier, seulement dans le second fichier, ou dans les deux fichiers. À titre d'exemple concret, vous pouvez l'utiliser pour comparer deux fichiers dict. Donc, sur OSX, j'ai un fichier de connecteurs et de mots dans/usr/share/dict. Je peux 'comm -23 mots connectifs' pour voir ces lignes dans le fichier de connecteurs qui ne sont pas dans le fichier de mots. sdiff avec la magie grep ou awk pourrait faire la même chose. Comm est juste un outil plus simple qui ne fonctionne pas correctement sur les fichiers non triés. – jabbie

Questions connexes