하위 디렉터리의 대소문자를 무시하고 이름으로 중복 파일 찾기

하위 디렉터리의 대소문자를 무시하고 이름으로 중복 파일 찾기

Linux 시스템에서 중복된 파일 이름을 나열하는 방법

  • 대소문자 무시
  • 모든 하위 디렉터리 포함

파일의 차이점을 기준으로 비교하면 안 됩니다.콘텐츠그러나 오직 그들의 것을 통해서만이름. 출력은 해당 파일에 대해 추가 명령을 실행할 수 있도록 경로를 포함한 파일 이름 목록이어야 합니다.

우리가 가지고 있다고 가정하자

ls -1R /tmp/
foo
BAR
barfoo
a/BAr
a/b/bar
c/bAr

필터/찾기 스크립트의 출력은 다음과 같아야 합니다.

/tmp/BAR
/tmp/a/BAr
/tmp/a/b/bar
/tmp/c/bAr

답변1

find . -printf "%p %f\n" | sort -f -k2 | uniq -Di -f1

find시작하지 않으려면 원하는 시작 디렉터리를 지정하십시오... -type f그냥 추가하고 싶다면문서이름. 

  • find명령은 디렉터리 순서(즉, 귀하의 경우 무작위 순서)로 파일(및 디렉터리) 이름 목록을 생성합니다.
  • -printf "%p %f\n"전체 경로 이름( 에 상대적 .)과 파일 이름을 인쇄합니다. 
  • sort -f는 약어입니다 sort --ignore-case. 즉, 대소문자를 구분하지 않고 파일 이름 목록을 정렬합니다.
  • -k2두 번째 필드를 정렬 키로 사용하도록 지시합니다. 
  • uniq -Di -f1즉, 두 번째 필드와 다른 필드(예: 동일한 파일 이름(대소문자 구분 안 함))를 대소문자를 구분하지 않고 비교하여 uniq --all-repeated --ignore-case --skip-fields=1반복되는(모든) 출력 행을 표시합니다 .find

이렇게 하면 원하는 출력이 제공되지만 각 줄 끝에 파일 이름이 반복됩니다. 제거하려면 를 입력하십시오 sed 's/ .*//'.

몇 가지 문제:

  • 당신이 가지고 있다면목차이름은 대소문자를 제외하고 동일하며, 대소문자를 제외하고 이름이 동일한 파일을 포함합니다. 예를 들어 다음과 같습니다.

    documents/design.doc
    Documents/Design.doc
    

    그러면 이러한 항목이 나열됩니다.

  • 파일(또는 디렉터리) 이름에 공백, 탭 또는 줄바꿈이 포함되어 있으면 문제가 발생합니다.

답변2

이는 기본 파일 이름에는 작동하지만 캐리지 리턴 및 기타 극단적인 경우가 있는 파일에는 작동하지 않습니다.

FilesNoPath=$(find . -printf "%f\n")
FilesWithPath=$(find .)

oldIFS=$IFS
IFS=$'\n'
for filename in $FilesNoPath;
do
    Matches=$(echo "$FilesWithPath" | grep -i "/$filename$")
    if [ $(echo "$Matches" | wc -l) -gt 1 ]
    then
        echo Found matches:
        echo "$Matches"
        FilesWithPath=$(echo "$FilesWithPath" | grep -vi "/$filename$")
    fi
done
IFS=$oldIFS

출력에 전체 경로를 표시하고 싶거나 일치하는 파일의 상위 디렉터리에서 이 명령을 실행하지 않으려면 .두 find 명령을 모두 바꿀 수 있습니다./path/to/your/files

관련 정보