수백만 개의 파일이 "손상된" 이름으로 저장되어 있습니다. 확장자는 _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.pdf
file.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
에시운전).