내 사진 라이브러리가 엉망이에요. 일부 복사본으로 인해 내 이미지는 다음과 같습니다.
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).png
and 가 있지만 somefile (2).png
가 없으면 및 somefile.png
는 somefile (1).png
모두 somefile (2).png
유지됩니다. 이것이 문제가 될 수 있는 경우 위 명령을 실행한 후 (1)
다음 명령 perl-rename
( rename
Ubuntu 및 기타 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
중복된 파일 이름은 제거되지 않지만 동일한 내용을 가진 연속 파일은 제거됩니다.