bash - 확장자에 관계없이 동일한 이름을 가진 모든 파일 찾기

bash - 확장자에 관계없이 동일한 이름을 가진 모든 파일 찾기

두 개의 영화 라이브러리를 병합하고 bash 스크립트를 통해 수동으로 "중복 제거"하고 싶습니다.

지금까지 내 사고 과정은 다음과 같습니다.

  • 확장자에 상관없이 이름이 같은 모든 파일 찾기
  • 더 작은 파일 삭제(저는 며칠 분량의 저장 공간이 있고 품질을 선호합니다!)

그 위에 쌓을 수 있으니 삭제된 부분을 어떻게든 분리할 수 있다면 그 위에 쌓을 수 있습니다. ffmpeg를 사용하여 비디오를 검사하고 더 나은 것을 선택할 수도 있지만 더 큰 크기 = 최상의 옵션이고 인코딩하기가 더 쉽다고 생각합니다.

Software Rec를 출시했습니다하지만 내가 원하는 것을 얻지 못했기 때문에 bash가 최선의 선택이라는 것을 깨달았지만 내 "찾기" 지식은 제한되어 있었고 내가 찾은 대부분의 답변은 복잡했고 이것이 간단한 문제여야 한다고 생각했습니다.

예를 들어:이름은 같지만 내용이 다른 파일을 찾으시나요?

답변1

다음은 중복 파일만 찾고 확장자를 무시하는 제가 작성한 좋은 방법입니다.

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

그런 다음 이를 이 루프로 래핑하여 각 파일 내의 두 파일 중 더 작은 파일을 찾습니다.

for i in $(find . -exec bash -c 'basename "$0" ".${0##*.}"' {} \; | sort | uniq --repeated); do find . -name "$i*" -printf '%s %p\n' | sort -n | head -1 | cut -d ' ' -f 2-; done

마지막으로 루프를 하나 더 수행하여(대화식으로 rm -i각 루프 앞에 프롬프트가 표시됨) 다음 파일을 모두 삭제합니다.

for j in $(for i in $(find . -exec bash -c 'basename "$0" ".${0##*.}"' {} \; | sort | uniq --repeated); do find . -name "$i*" -printf '%s %p\n' | sort -n | head -1 | cut -d ' ' -f 2-; done); do rm -i "$j"; done

find여기에는 디렉터리에 대해 두 가지 작업을 수행하는 작업이 포함되므로 더 나은 방법이 있어야 합니다. 하지만 이는 간단한 경우에는 작동합니다. 또한 현재 디렉터리에서 작업하고 있다고 가정합니다. 다른 디렉터리에서 명령을 실행하려면 .find명령의 매개변수를 변경하기만 하면 됩니다.

답변2

.srt 파일 문제를 해결해야 했기 때문에 이 작업을 수행한 방법은 다음과 같습니다.

이름은 같지만 확장자가 다른 파일을 찾습니다.

ls * | sed 's/.\{4\}$//' | sort | uniq -d

참고: 확장자가 4자인지 여부에 따라 다릅니다. 예를 들어 .XYZmpeg에서는 작동하지 않지만 내 영화는 모두 mp4/mkv/m4v입니다.

.srt 파일 무시:

ls * |  awk '!/.srt/'  | sed 's/.\{4\}$//' | sort | uniq -d

파일 크기를 비교하는 별도의 스레드를 게시했지만 Harry's Answer는 완화해야 할 .srt 문제가 있다는 점을 제외하고는 훌륭한 작업을 수행했습니다.

두 파일 크기를 비교하고 더 작은 파일을 삭제합니다.

관련 정보