Étant donné bash, cela pourrait être plus facile car
$ comm <(ls -a dir1) <(ls -a dir2)
L' <(command)
expression exécute la commande sur un canal et remplace une /dev/fd
référence:
mress:10018 Z$ echo <(ls)
/dev/fd/11
Ainsi, la commande ci-dessus s'exécute ls -a
sur chaque répertoire et alimente leurs sorties en tant qu'arguments de fichier comm
, qui génère jusqu'à 3 colonnes, en retrait par tabulation: entrées uniquement dans le premier, entrées dans les deux, entrées dans le second. (Autrement dit, s'il est dans les deux, il est indenté par un onglet, s'il est uniquement dans le second, il est indenté par 2 onglets.) Vous pouvez également supprimer les colonnes par numéro: comm -1 foo bar
affiche uniquement les lignes des deux et les lignes du deuxième fichier, ce dernier étant échancré d' un onglet. (Ceci est le plus souvent utilisé en supprimant tout sauf la colonne souhaitée: comm -13 foo bar
affiche uniquement les lignes en commun.)
Étant donné que vous voulez ceux du premier répertoire, cela se traduit par
$ comm -23 <(ls -a dir1) <(ls -a dir2)
Si vous avez besoin de plus que simplement s'il est présent, utilisez diff -r
, qui produira des différences pour les fichiers communs et un message d'une ligne pour les fichiers trouvés uniquement dans l'un ou l'autre.
ls
viendra avec tous les problèmes d'espace blanc, tabulations, sauts de ligne, backspaces et autres dans les noms de fichiers.ls -b
.find
. Mais ma principale plaintefind
est que c'est un marteau très lourd pour écraser ce qui est généralement une mouche assez petite.Et voici un pur script. Ce sont les répertoires a et b:
Voici la commande:
production:
Échangez a et b pour les fichiers dans a mais pas dans b. Le ! est une négation. -e teste -existence. En prosa: "Tester s'il n'existe pas le fichier trouvé dans un dans ../b".
Remarque: vous devez plonger dans une première, pour obtenir des noms sans «a». Pour la deuxième comparaison, vous devez cd
../b
.la source
Si vous préférez un outil graphique, utilisez
vous devrez peut-être d'abord l'installer. Des programmes similaires sont
Le commandant de minuit a une
compare directories
commande intégrée, qui fonctionne bien, si vous n'allez pas pour les sous-répertoires.la source
Vous pouvez utiliser la
join
commande négligée . Voici une configuration pour deux répertoires d'exemple, d1 / et d2 /, chacun ayant des fichiers avec des noms uniques au répertoire et des fichiers avec des noms en commun avec l'autre répertoire. Ceci n'est qu'un exemple, j'ai donc utilisé des noms de fichiers à une seule lettre pour illustrer les noms de fichiers uniques à l'un ou à l'autre et les noms de fichiers en commun.Pour moi, il montre des fichiers comme celui-ci:
MISE À JOUR: Vous voudriez faire différentes choses dans la vie réelle pour accueillir des fichiers avec des espaces, comme
join
utilise le premier champ "délimité par des espaces" pour décider quelles lignes sont uniqe et quelles lignes sont communes.la source
join -t ''
(pas de délimiteur) aiderait ce cas.d2/f
maisd2/f
. Les tabulations et les retours à la ligne dans les noms de fichiers sont rares, mais autorisés.Vous pouvez utiliser
find
etawk
pour résoudre ce problème.Avec la disposition suivante:
Partie un:
Deuxième partie:
Cela se compare à une
comm
solution:Et à une
join
solution:la source
utiliser mes fonctions:
la source