OSX 명령줄 확장자가 다른 중복 파일 이름 찾기

OSX 명령줄 확장자가 다른 중복 파일 이름 찾기

비슷한 질문을 모두 살펴보고 더프와 같은 몇 가지 명령줄 유틸리티를 설치했지만 성공하지 못했습니다.

내 이미지 디렉토리에 이름은 같지만 확장자가 다른 이미지(jpg 및 png)가 있습니다. 다른 확장자를 가진 중복 파일 이름의 파일 이름을 인쇄하고 싶습니다. (예: foo.jpg & foo.png) 또는 하나 이상의 파일 이름(foo)

지금까지 나는 이러한 방법을 시도했습니다

find . -exec bash -c 'basename "$0" ".${0##*.}"' {} \; | sort | uniq

find . -type f \( -name "*.jpg" -o -name "*.png" \)

이 명령의 대부분은 나에게 다음 중 하나를 반환합니다.아무것도 아님또는모든 파일또는고유한파일 이름은 아니지만중복된 것.

답변1

두 번째 명령을 수정하는 것이 좋습니다.

find . -type f -name "*.jpg" | \
    while read -r f; do [ -e "${f%.jpg}.png" ] && echo "${f%.jpg}"; done

모든 파일을 찾아 .jpg해당 .png파일이 존재하는지 확인하고 확장자를 제외한 전체 경로를 표시합니다.

파일 수가 훨씬 적다면 .png해당 파일을 검색하고 해당 파일을 확인하는 것이 더 효율적이라는 점에 유의하세요 .jpg.

[ bashUbuntu 18.04.1에서 테스트되었습니다.]

답변2

답변을 수락하고 감사드립니다. 그 사이에 나는 내가 찾던 것과 어느 정도 비슷하게 작동하는 Python 스크립트를 얻었습니다. 출처를 찾으려고 노력했지만 검색한 100여 개의 탭에서 찾을 수 없었습니다.

#!/usr/bin/env python
# Syntax: duplicates.py DIRECTORY
import os, sys
top = sys.argv[1]
d = {}

for root, dirs, files in os.walk(top, topdown=False):
  for name in files:
    fn = os.path.join(root, name)
    basename, extension = os.path.splitext(name)

    basename = basename.lower() # ignore case

    if basename in d:
        print(d[basename])
        print(fn)
    else:
        d[basename] = fn

이 파일을 Duplicates.py로 저장하고 권한을 부여한 뒤 해당 폴더에서 실행해 보세요.

./duplicates.py Images

답변3

을 사용 uniq -c하여 개수를 얻은 다음 마지막에 역정렬하여 중복 항목을 먼저 나열해야 합니다. 마지막에는 awk2 이상으로 시작하는 줄을 필터링하는 데 사용됩니다.

$ find . -type f -exec sh -c 'basename ${0%.*}' {} \; | sort | uniq -c | sort -r | awk 'int($1)>=2'
   2 foo

여기서는 %.*확장자를 제거하므로 foo.x.y가 됩니다 foo.x.

find . -type f모든 파일을 찾는 간단한 대신 두 번째 명령과 같이 파일을 *.jpg필터링 할 수도 있습니다.*.png

관련 정보