파일 이름에서 특정 문자열을 제거하는 스크립트

파일 이름에서 특정 문자열을 제거하는 스크립트

CentOS에서 파일 이름의 일부를 제거하기 위해 bash 스크립트를 작성하려고 합니다. 내 파일 이름은 다음과 같습니다.

119903_Relinked_new_3075_FileNote_07_02_2009_JHughes_loaMeetingAndSupport_FN_205.doc
119904_relinked_new_2206_Support_Intensity_Scale_SYCH_SIS_264549.pdf
119905_relinked_new_3075_Consent_07_06_2009_DSweet_CRFA_CF_16532.docx
29908_relinked_new_2206_Assessor_Summary_Report_SERT_I_OTH_264551.pdf
009712_relinked_new_3075_Consent_07_06_2009_CWell_DPRT_check_CF_16535.pdf

파일 이름에서 제거하고 싶습니다 119903_Relinked_new_. 최종 결과는 다음과 같습니다.

3075_FileNote_07_02_2009_JHughes_loaMeetingAndSupport_FN_205.doc
2206_Support_Intensity_Scale_SYCH_SIS_264549.pdf
3075_Consent_07_06_2009_DSweet_CRFA_CF_16532.docx
2206_Assessor_Summary_Report_SERT_I_OTH_264551.pdf
3075_Consent_07_06_2009_CWell_DPRT_check_CF_16535.pdf

나는 좋은 결과를 얻지 못한 채 여러 스크립트를 시도했습니다. 대부분의 경우 앞의 숫자가 _Relinked_new_다르며, 파일 확장자는 .pdf, 등 .docx으로 다양합니다 . .doc어떤 도움이라도 대단히 감사하겠습니다.

답변1

사용이름(1)도구( 시스템에 따라 rename또는 라고 prename불릴 수 있음 ):perl-rename

rename 's/[0-9]+_[rR]elinked_new_//' /path/to/dir/*

정규식을 사용하여 패턴을 일치시키고 지정된 파일에 있는 내용으로 바꿉니다.

답변2

해당 도구가 없으면 rename매개변수 대체와 함께 간단한 쉘 루프를 사용하여 한 번에 하나씩 파일 이름을 바꿉니다.

for name in /path/to/dir/*_[rR]elinked_new_*
do
    newname=${name##*/}
    newname=${name%/*}/${newname#*_[rR]elinked_new_}

    # or:
    # newname=$(basename "$name")
    # newname=$(dirname "$name")/${newname#*_[rR]elinked_new_}

    mv -- "$name" "$newname"
done

루프 내에서 값은 먼저 변수의 파일 이름 부분(경로 이름에서 마지막 슬래시 다음의 마지막 비트) newname으로 평가 됩니다.name

그런 다음 변수가 디렉토리 경로인 것처럼 가장하고 newname파일 이름의 시작 부분에서 쉘 패턴과 일치하는 텍스트의 결과를 제거하여 변수를 수정합니다.*_[rR]elinked_new_

먼저 현재 디렉터리를 파일이 있는 디렉터리로 변경하면 코드가 약간 단순화될 수 있습니다.

cd /path/to/dir || exit

for name in *_[rR]elinked_new_*
do
    newname=${name#*_[rR]elinked_new_}
    mv -- "$name" "$newname"
done

답변3

이것은 실제로 "인수 목록이 너무 김" 문제에 대한 설명이었지만 설명 상자에서 혼란스러워 보이기 시작했기 때문에 이제 답변이 되었습니다. :)

해당 오류가 발생하는 이유는 *길이 제한이 있는 명령줄의 디렉터리에 모든 파일을 넣으려고 하기 때문입니다. 대신, 파일을 반복하거나 다음과 find같이 비슷한 작업을 수행하고 각 파일에 대해 개별적으로 이름 바꾸기를 호출할 수 있습니다.

find /path/to/dir -iname '*relinked_new_*' -exec prename 's/[0-9]+_[rR]elinked_new_//' {} \;

관련 정보