2016-10-24 1 views
2

나는이 중첩 된 디렉토리 중복이있는 대형 디렉토리 트리 (전부는 아니지만)가 찾기 :중복 중첩 디렉토리

  • 데이터/가정/홈/
  • 데이터/배너/배너/
  • 자원/나는이 행동 만 중복 디렉토리를 병합 할 수 있습니다 어떻게 사용자/문서/문서/

:

    (교체하지 않고) 16,
  • 사본 데이터/가정/홈/데이터/집 내용/
  • 데이터/가정/삭제

내 현재 코드 :

#/bin/bash 

for folder in $(find httpdocs -type d); do 
    n=$(echo $folder | tr "/" "\n" | wc -l) 
    nuniq=$(echo $folder | tr "/" "\n" | sort | uniq | wc -l) 

    [ $n -eq $nuniq ] || echo "Duplicated folder $folder" 
done 

데이터/home/es/home이 유효한 폴더이지만 중복 된 것으로 탐지 되었기 때문에 문제가 발생했습니다.

감사합니다.

+0

다른 사용자로부터 답장을 받으려면 시도를해야 할 수도 있습니다. – Fazlin

+0

@ Fazlin, 어떻게해야할지 모르겠다. 나는 주요 리눅스 명령을 안다. 그리고 나는 배쉬로 카운터와 카운터를 어떻게 할 수 있는지 알고있다.하지만 좀 더 최적화가 필요하다. 최대한 빨리 예제를 게시하겠습니다. 팁 고마워. – Lito

답변

2

다음과 같이 uniq 명령을 사용할 수 있습니다.

#/bin/bash 

for folder in $(find httpdocs -type d); do 
    nuniq=$(echo $folder | tr "/" "\n" | uniq -d | wc -l) 
    if [ "$nuniq" -gt "0" ] 
     then 
     echo "Duplicated folder $folder" 
     fi 
done 

남자 UNIQ;

-d, --repeated 
      only print duplicate lines 

는 복사본에 대 한 다음 스크립트를 시도하고 폴더를 삭제할 수 있습니다. 이걸 테스트 할 수 없으니, 이것을 실행하기 전에 httpdocs 폴더를 백업 해 두십시오.

#/bin/bash 

for folder in $(find httpdocs -type d); do 
    nuniq=$(echo $folder | tr "/" "\n" | uniq -d | wc -l) 
    if [ "$nuniq" -gt "0" ] 
     then 
     dest=$(echo $folder | tr '/' '\n' | awk '!a[$0]++' | tr '\n' '/') 
     mv -i $folder/* $dest 
     rmdir $folder 
     fi 
done 

예를 들어;

[email protected] $ echo "data/home/es/home" | tr "/" "\n" 
data 
home 
es 
home 

[email protected] $ echo "data/home/es/home" | tr "/" "\n" | uniq -d | wc -l 
0 

[email protected] $ echo "data/home/home" | tr "/" "\n" 
data 
home 
home 

[email protected] $ echo "data/home/home" | tr "/" "\n" | uniq -d 
home 

[email protected] $ echo "data/home/home" | tr "/" "\n" | uniq -d | wc -l 
1