2012-11-29 3 views
2

디렉터리 계층 구조 목록을 단일 디렉터리로 병합하고 싶습니다. 나중에 목록에있는 중복 된 파일은 이전 파일을 대체합니다. 예를 들어 ... 여러 디렉토리를 하나의 디렉토리에 평평하게하고 오버레이하려면 어떻게해야합니까?

foo/This/That.pm 
bar/This/That.pm 
bar/Some/Module.pm 
wiff/This/That.pm 
wiff/A/Thing/Here.pm 

이것은

This/That.pm  # from wiff/ 
Some/Module.pm # from bar/ 
A/Thing/Here.pm # from wiff/ 

와 바람 것이라고 나는이 작업을 수행 할 수있는 아마 복잡한 펄 이상 프로그램이 있습니다. 나는 SO 사용자가 해결할 수있는 영리한 방법에 관심이있다. 가장 큰 장애물은 basename과 dirname을 조합 한 "필요한 경우 중간 디렉토리 만들기"입니다.

진짜 문제는 두 개의 설치된 Perl 라이브러리의 차이점을 확인하는 것입니다. 필자는 각 Perl에 대한 여러 라이브러리 디렉토리를 단일 디렉토리로 단순화하여 Perl이 모듈을 검색하는 방법을 시뮬레이션합니다. 그런 다음 diff -r 수 있습니다. 당신이 항목의 마지막 순서를 신경 쓰지 않는 경우

답변

1

, 나는이 일을 할 수있는 것 같아요 :

#!/bin/bash 

declare -A directory; 

while read line; do 
    directory["${line#*/}"]=${line%%/*} 
done < $1 

for entry in ${!directory[@]}; do 
    printf "%s\t# from %s/\n" $entry ${directory[$entry]} 
done 

출력 :

$ ./script.sh files.txt 
A/Thing/Here.pm # from wiff/ 
This/That.pm # from wiff/ 
Some/Module.pm # from bar/ 

그리고 당신은 다음, 파일을 이동해야하는 경우 또는 cp - - 당신은 단순히 mv와 인쇄 단계를 대체 할 수있는이 같은 :

for entry in ${!directory[@]}; do 
    mv "${directory[$entry]}/$entry" "your_dir_path/$entry" 
done 
+0

orde 레이어 링이 중요하므로 링이 올바르게 작동합니다. 결과의 최종 순서는 중요하지 않습니다. 나는 결코'선언 '을 보지 못했고 배시에는 해시가 있는지 전혀 몰랐습니다! 나는 files.txt가'find라고 추정한다. - 타입 f를'문제의 디렉토리? – Schwern

+0

정확히 find를 할 수 있다고 생각합니다. -type f'; 직접 실행하려면, 다음을 수행하여 임시 파일을 만들 수 있습니다 : while while ...; do ..; done <(find. -type f)' – Rubens

관련 문제