디렉토리에 동일한 파일/디렉터리 이름을 다른 대소문자로 재귀적으로 나열하는 방법은 무엇입니까? 전임자. :
입력( ls
명령, 디렉터리 아님):
[user@localhost ~/a] ls -R
.:
b
./b:
ize Ize
./b/ize:
./b/Ize:
[user@localhost ~/a]
산출:
/b/ize
답변1
GNU가 있는 경우 대소문자를 구분하지 않고( ) 정렬하고 중복된 줄만 인쇄할 uniq
수 있습니다 .-i
-d
find . | sort -f | uniq -di
@StephaneChazelas가 그의 기사에서 언급했듯이답변a/b/foo
, 대소문자만 다른 중복 경로가 있는 경우(예: 및 ) A/b/foo
예상한 대로 작동하지 않을 수 있습니다 .
답변2
파일 이름에 개행 문자가 포함되어 있지 않다고 가정하면 다음을 수행할 수 있습니다.
find . | tr '[:upper:]' '[:lower:]' | sort | uniq -d
일부 tr
구현(예: GNU) 은 tr
멀티바이트 문자의 대소문자를 변경하지 않습니다.
또한 보고되는 경로는 파일 경로가 아닐 수도 있습니다. 예를 들어, ./a/b/fOo
및 ./A/b/fOo
파일이 있는지 보고합니다 ./a/b/foo
. 이것이 원하는 것이 아니라면 요구 사항을 구체화해야 할 수도 있습니다.
답변3
이런 생각은 모두 나쁜 것입니다. 체크섬을 사용하여 파일이 동일한지 확인하세요. 그러면 작업이 쉬워집니다.
find . -type f -exec md5sum {} + |
sort |
perl -a -nE'push(@{$db{$F[0]}},$F[1]);END{for(keys%db){say"Dupe detected @{@db{$_}}"if scalar@{$db{$_}}>1}}'
이는 디렉터리와 모든 하위 디렉터리의 모든 파일을 sha1합계하고 해당 파일의 모든 중복 파일(있는 경우)을 출력합니다. 가독성을 위해 파이프를 여러 줄로 설정했습니다.