내 사진 라이브러리가 엉망이에요. 다음과 같은 파일이 있습니다.
image-1.jpg
image-1.jpeg
image-2.jpg
이제 이름은 같지만 확장자가 .jpg인 파일이 있는 경우 확장자가 .jpeg인 사진을 모두 삭제하고 싶습니다.
어떻게 해야 하나요?
답변1
for f in *.jpeg; do
[ -e "${f%.*}.jpg" ] && echo rm -- "$f"
done
( 만족스러우면 삭제하세요 echo
).
zsh
한 번의 통화 로 rm
:
echo rm -- *.jpeg(e'{[ -e $REPLY:r.jpg ]}')
( 이 작업을 반복적으로 수행 *
하도록 변경하고 **/*
, D
숨겨진 파일이나 숨겨진 디렉터리의 파일도 고려하려면 glob 한정자를 추가하세요.)
답변2
에서 적응비슷한 질문에 대한 답변:
find . -type f -name '*.jpeg' -exec sh -c '
for pathname do
jpg_pathname=${pathname%.jpeg}.jpg
if [ -f "$jpg_pathname" ]; then
printf "Would remove %s\n" "$pathname"
# rm "$pathname"
fi
done' sh {} +
.jpeg
이것은 파일 이름 접미사가 있는 현재 디렉토리 안이나 아래의 모든 파일의 경로 이름을 찾습니다. 이러한 경로 이름의 가능한 가장 큰 배치에 대해 짧은 인라인 스크립트가 호출됩니다. 스크립트는 경로 이름의 현재 배치를 반복하고 같은 이름 뒤에 트렁크가 있는 파일을 검색합니다 .jpg
. .jpeg
파일에 해당 .jpg
파일이 있으면 해당 .jpeg
파일이 삭제됩니다(주석 처리가 rm
활성화된 경우).
더 짧은 버전(안전 관련 설명이 제거되고 텍스트가 출력되지 않음):
find . -type f -name '*.jpeg' -exec sh -c '
for pathname do
[ -f "${pathname%.jpeg}.jpg" ] && rm "$pathname"
done' sh {} +
(이로 인해 다음의 재귀적 변형이 발생한다는 것을 알 수 있습니다.Stefan Chazeras의 답변)
답변3
readonly path="${1:-./}"
for file in "${path}"*.jpeg; do
if [[ -f ${file%.jpeg}.jpg ]]; then
rm -- "$file"
printf '%s\n' "removed duplicate file ${file}"
fi
done
상단의 읽기 전용 변수를 사용하면 디렉터리 경로를 스크립트에 매개변수로 전달할 수 있습니다. 인수가 제공되지 않으면 기본값은 현재 디렉터리입니다.
단순히 var 경로로 지정된 디렉터리에서 ".jpeg"로 끝나는 모든 파일을 반복합니다. 그런 다음 확장자를 제거하고 .jpg 확장자를 가진 동일한 파일이 존재하는지 테스트합니다. .jpg 중복 파일이 존재하는 경우 .jpeg 파일은 중복 파일로 간주되어 삭제됩니다.
답변4
현재 답변은 질문 본문의 특정 사례에 대한 답변이지만 삭제의 경우모두다른 파일은 병합했습니다.Stefan Chazeras의 답변그리고이 답변글로벌 매치 제외 관련:
shopt -s extglob
for f in *.jpeg; do
[ -e "$f" ] && echo rm -- "${f%.*}".!(jpeg)
done