CentOS 7 시스템에서 수천 개의 파일 이름을 반복적으로 바꿔야 합니다. 현재 형식은 다음과 같습니다.
(32-64 alphanumerics)_various special characters.wav
즉, 3레벨 깊이의 모든 파일에서 확장자를 반복적으로 제거하고 싶습니다 _
(참고: 모든 확장자는 다음과 같습니다)..wav
.wav
예: 기존:
/home/user/recordings/TEST/december/157A757989F047C3AC2EC3499B4D04A5_7075276189 by [email protected] @ 8_44_52 AM.wav
/home/user/recordings/test/october/28D1E1840DE24D9DB4CF6D1A707533F6337C2DDE_2018690759 by [email protected] @ 1_26_55 PM.wav
예상하다:
/home/user/recordings/TEST/december/157A757989F047C3AC2EC3499B4D04A5.wav
/home/user/recordings/test/october/28D1E1840DE24D9DB4CF6D1A707533F6337C2DDE.wav
나는 많은 검색을 했고 파일 이름의 다른 부분을 수정하는 많은 방법을 찾았지만 특정 문자( _
)와 확장자 앞의 모든 내용을 유지하지 않았습니다.
도움을 주셔서 미리 감사드립니다.
답변1
디렉터리 부분, 파일 이름 및 앞의 문자를 추출해야 합니다.첫 번째밑줄( 모든 파일 .wav
에 대해 별도의 변수에 확장자를 저장할 필요가 없기 때문에):
find /home/scott/ -maxdepth 4 -type f -name '*_*.wav' -exec sh -c 'h=${1%/*}
t=${1##*/}; echo mv "$1" "${h}/${t%%_*}".wav' doom {} \;
echo
실제로 파일 이름을 바꾸려면 삭제하세요 .
답변2
나는 많은 검색을 했고 파일 이름의 다른 부분을 수정하는 많은 방법을 찾았지만 특정 문자(_)와 확장자 앞의 모든 내용을 유지하지 않았습니다.
이것은 sed
트릭을 수행하는 것 같습니다
sed -E 's/(.*)_[0-9].* by .*(\.wav)/\1\2/'
echo "/home/user/recordings/TEST/december/157A757989F047C3AC2EC3499B4D04A5_7075276189 by [email protected] @ 8_44_52 AM.wav" | sed -E 's/(.*)_[0-9].* by .*(\.wav)/\1\2/'
/home/user/recordings/TEST/december/157A757989F047C3AC2EC3499B4D04A5.wav
다른 예제 문자열로 테스트합니다.
echo "/home/user/recordings/test/october/28D1E1840DE24D9DB4CF6D1A707533F6337C2DDE_2018690759 by [email protected] @ 1_26_55 PM.wav" | sed -E 's/(.*)_[0-9].* by .*(\.wav)/\1\2/'
/home/user/recordings/test/october/28D1E1840DE24D9DB4CF6D1A707533F6337C2DDE.wav
사용 중에 sed
표현식의 일부를 저장 ()
한 다음 다시 넣을 수 있습니다 \1\2
.
답변3
prename
예를 들어, (Perl 이름 바꾸기) 구현을 설치하십시오.File::Rename
또는에서Unicode::Tussle
. (마지막으로 본 바에 따르면 CentOS에는 Perl 이름 변경 기능이 없으며 util-linux만으로는 rename
필요한 작업을 수행할 수 없지만 CentOS 7에서는 변경되었을 수 있습니다.) 모두 기본 구문을 갖고 있으며 일부는 각 파일을 변환하기 위한 구문을 포함합니다. Perl 코드로 명명되었습니다.prename CODE FILENAME...
CODE
find /home/user/recordings/ -type f -exec prename 's!_[^/]*(\.[^./]*)$!$1!' {} +
Perl의 설명: (\.[^./]*)$
이름 끝의 확장자와 일치합니다. _[^/]*
첫 번째 밑줄(슬래시 없음)로 시작하는 디렉토리 부분을 제외하고 파일 이름의 모든 것과 일치합니다. $
브래킷 그룹의 첫 번째이자 유일한 부품 인 으로 대체되었습니다 .