(1), (2)의 파일이 존재하지 않을 경우 해당 파일을 삭제하세요.

(1), (2)의 파일이 존재하지 않을 경우 해당 파일을 삭제하세요.

내 사진 라이브러리가 엉망이에요. 일부 복사본으로 인해 내 이미지는 다음과 같습니다.

IMG_20220505_1701.jpg
IMG_20220505_1701 (1).jpg
IMG_20220505_1701 (2).jpg

이제 이름에 (1) 또는 (2)가 있는 모든 사진을 삭제하고 싶습니다. 단, 해당 파일에 대한 파일이 없는 경우에만 해당됩니다. 어떻게 해야 하나요?

답변1

숫자가 없는 파일이 있는 경우 이름에 괄호 안에 숫자가 있는 모든 파일이 삭제됩니다.

for file in *'('* ; do 
    origFile=$(sed 's/ *([0-9]*)//' <<<"$file")
    [ -e "$origFile" ] && [ "$file" != "$origFile" ] && rm -- "$file"
done

숫자가 없는 파일이 없으면 모든 숫자 파일이 보존됩니다. 예를 들어 somefile (1).pngand 가 있지만 somefile (2).png가 없으면 및 somefile.pngsomefile (1).png모두 somefile (2).png유지됩니다. 이것이 문제가 될 수 있는 경우 위 명령을 실행한 후 (1)다음 명령 perl-rename( renameUbuntu 및 기타 Debian 기반 배포판에서 호출됨)을 사용하여 모든 파일의 이름을 바꿀 수 있습니다.

rename -- 's/ \(1\)//' *'(1)'*

그런 다음 첫 번째 명령을 다시 실행하여 하나만 유지합니다. 또는 파일만 존재하는 상황이 발생하는 경우 (2)시도해 볼 수도 있습니다 (N).

답변2

를 사용하면 zsh다음을 수행할 수 있습니다.

rename-or-delete() {
  if [[ -e $2 ]]; then
    rm -- $1
  else
    mv -- $1 $2
  fi
}
autoload zmv
zmv -n -f -P rename-or-delete '(*) \(<->\)(.jpg)' '$1$2'

( -n원하는 경우 시험 실행을 위해 제거).

답변3

귀하가 요청한 것과 정확히 일치하지는 않지만 (테스트되지 않은) 동일한 정신이라고 생각합니다.

#!/bin/sh
last=x
for i in * ; do
  if [ -f "$i" ] ; then
    if cmp "$last" "$i" ; then
      rm -f "$i"
    else
      last="$i"
    fi
  fi
done

중복된 파일 이름은 제거되지 않지만 동일한 내용을 가진 연속 파일은 제거됩니다.

관련 정보