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