2010-08-22 2 views
0

Je suis en train d'écrire un script rapide dans Ruby qui passe en revue tout le contenu de deux dossiers, et retourne une liste de tous les fichiers qui sont pas dans l'un des deux dossiers. À l'heure actuelle ce que je fais est de stocker les chemins de tous les fichiers de chaque répertoire dans un tableau:Comparer le contenu de 2 dossiers et supprimer les fichiers avec le même nom qui sont présents dans les deux dossiers

Find.find(dir1) do |path| 
    if File.file?(path) 
    directory1_files << path # Add path to an array of file_paths for the 1st directory. 
    end 
end # I repeat the process for the second directory and store their paths in an array called directory2_files. 

Le problème que j'ai est que quand je tente de soustraire les deux tableaux (array plus grand - petit tableau) pour obtenir les fichiers restants, j'obtiens un tableau vide. Raison que je reçois est parce que les chemins complets essaient d'être soustraits au lieu de simplement les noms de bas. Ex: ~/dossier1/fichier.txt! = ~/Dossier2/fichier.txt Comment puis-je trouver si un fichier avec le même nom est dans deux dossiers, et le retirer d'une liste afin que les seuls fichiers restants sont ceux qui ne sont pas présent dans les deux dossiers?

Répondre

2

Comme vous le savez les chemins vers les deux dossiers (à savoir dir1 et dir2) Je vous suggère de calculer des chemins relatifs à eux, afin que vous puissiez comparer plus tard des chemins relatifs (en ignorant efficacement la ~/folder1 partie du chemin). Utilisez les dictionnaires pour mapper les chemins relatifs et absolus (afin de pouvoir les supprimer).

Quelque chose comme ceci:

dir1 = '~/folder1' 
directory1_files = {} 

Find.find(dir1) do |path| 
    if File.file?(path) 
    relative_path = path[dir1.length, path.length] 
    directory1_files[relative_path] = path 
    end 
end 

Ensuite, chaque fois que vous avez directory1_files et directory2_files, comparer leur .keys afin de trouver les différences.

0

Utilisez File.basename (nom de fichier). Cela fonctionne également si "filename" est un objet File.

+0

Cela ne fonctionnera pas avec les répertoires imbriqués, c'est-à-dire 'dir1/file.txt' et' dir2/subdir1/file.txt' seront considérés comme ayant le même chemin relatif, alors qu'ils ne le sont pas. –

+0

Le chemin est ignoré avec File.basename(). Il renvoie uniquement le nom de fichier sans sa partie de répertoire. File.basename ('~/rep1/file.txt') et File.basename ('~/dir2/subdir1/file.txt') renvoient 'file.txt'. – Alkaline

Questions connexes