마지막 문자 "_"를 찾아 "."으로 대체합니다. 파일명을 재귀적으로 처리합니다.

마지막 문자 "_"를 찾아 "."으로 대체합니다. 파일명을 재귀적으로 처리합니다.

수백만 개의 파일이 "손상된" 이름으로 저장되어 있습니다. 확장자는 _pdf.

내가 원하는 것은 예상대로 포인트를 사용하도록 이러한 모든 확장을 재귀적으로 편집하는 것입니다.

find . -name '*_pdf' -type f -exec bash -c 'mv -- "$1" "${1//_/.}"' -- {} \;

이 bash 스크립트를 시도했지만 생성된 모든 "_"가 "."로 대체됩니다. 일반적인 확장명(pdf, jpg, jpeg)을 계속 사용하는 경우 마지막 _만 필요합니다.

답변1

_전역 적이므로 모든 인스턴스를 교체합니다 ${1//_/.}( ${1/_/.}비전역적이지만 교체함).첫 번째마지막 항목 대신 일치).

대신 POSIX를 사용하여 가장 짧은 접미사와 가장 긴 접두사를 제거한 다음 다시 결합할 수 ${1%_*}있습니다 ${1##*_}.

find . -name '*_pdf' -type f -exec sh -c 'mv "$1" "${1%_*}.${1##*_}"' sh {} \;

또는

find . -name '*_pdf' -type f -exec sh -c 'for f do mv "$f" "${f%_*}.${f##*_}"; done' sh {} +

여러 확장의 경우:

find . \( -name '*_pdf' -o -name '*_jpg' -o -name '*_jpeg' \) -type f -exec sh -c '
  for f do mv "$f" "${f%_*}.${f##*_}"; done
' sh {} +

--옵션 끝 구분 기호를 제거했습니다 . find이름 앞에 가 있으므로 여기서는 필요하지 않습니다 ./.

-i특정 디렉토리에 위험 이 mv있고 file_pdf기존 .file.pdffile.pdf

답변2

Perl rename도구를 사용하십시오.

find ... rename 's/_pdf$/.pdf/' {} +

다양한 확장에 대해 별도로 실행하거나 여러 "범용 확장"을 한 번에 바꿀 수 있습니다.

find ... rename 's/_(pdf|jpg|jpeg)$/.\1/' {} +

Perl 이름 바꾸기가 없다면 다른 것을 사용할 수 있습니다rename도구:

find ... rename '_pdf' '.pdf' {} +

답변3

필수 zsh버전:

autoload zmv # best in ~/.zshrc
zmv -v '(**/)(*)_(pdf|jpg|jpeg)(#q.)' '$1$2.$3'

( (#q.)제한된정기적인파일은 그대로 find입니다 -type f. (#qD.)이와 같이 숨겨진 파일이나 숨겨진 디렉터리에 있는 파일의 이름도 바꾸려면 로 변경하세요 find. -v사용. . . 대신 -n시운전).

관련 정보