밑줄 앞의 모든 문자를 유지하면서 파일 이름을 반복적으로 바꿉니다.

밑줄 앞의 모든 문자를 유지하면서 파일 이름을 반복적으로 바꿉니다.

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의 설명: (\.[^./]*)$이름 끝의 확장자와 일치합니다. _[^/]*첫 번째 밑줄(슬래시 없음)로 시작하는 디렉토리 부분을 제외하고 파일 이름의 모든 것과 일치합니다. $브래킷 그룹의 첫 번째이자 유일한 부품 인 으로 대체되었습니다 .

관련 정보