2010-08-22 5 views
0

현재 두 개의 폴더의 모든 내용을 처리하는 빠른 스크립트를 Ruby에 작성하고있는 모든 파일의 목록을 반환합니다 두 폴더 중 하나에 없습니다. 현재 제가 배열의 각 디렉토리의 모든 파일의 경로를 저장하는 일을 오전 :두 폴더의 내용을 비교하고 두 폴더에있는 같은 이름의 파일을 제거하십시오.

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. 

오전 데 문제는 내가 (큰 배열 - 작은 배열을) 두 개의 배열을 시도하고 뺄 때 나머지 파일을 얻으려면 빈 배열이 나옵니다. 이유는 전체 경로가 단지 basename 대신 감해 지려고하기 때문입니다. 예 : ~/folder1/file.txt! = ~/folder2/file.txt 같은 이름의 파일이 두 개의 폴더에있는 경우 어떻게 찾을 수 있습니까? 두 폴더에 모두 있습니까?

답변

2

두 폴더 (즉, dir1dir2)에 대한 경로를 알고 있으므로 나중에 상대 경로를 비교할 수 있도록 해당 경로를 상대 경로로 계산하는 것이 좋습니다. ~/folder1 부분을 무시하십시오. 사전을 사용하여 상대 경로와 절대 경로를 매핑하여 제거 할 수 있습니다. 이 같은

뭔가 : 당신이 directory1_filesdirectory2_files있을 때마다

다음
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 

는, 비교 자신의 .keys 차이점을 찾기 위해있다.

0

File.basename (filename)을 사용하십시오. 이것은 "filename"이 File 객체 인 경우에도 작동합니다.

+0

이것은'~ dir1/file.txt'와'~ dir2/subdir1/file.txt'가 중첩 된 디렉토리에서는 작동하지 않지만 상대 경로는 같은 것으로 간주됩니다. –

+0

File.basename()에서는 경로가 무시됩니다. 디렉토리 부분이없는 파일 이름 만 리턴합니다. File.basename ('~/dir1/file.txt')과 File.basename ('~/dir2/subdir1/file.txt') 모두 'file.txt'를 반환합니다. – Alkaline

관련 문제