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_//' {} \;