Bash 쉘에서 많은 파일의 이름을 바꾸는 방법은 무엇입니까?

Bash 쉘에서 많은 파일의 이름을 바꾸는 방법은 무엇입니까?

질문해서 죄송합니다. 인터넷을 많이 검색했지만 효과가 있는 답변을 찾을 수 없었습니다(제안 사항이 많았음에도 불구하고).

그래서 많은 파일의 이름을 바꾸고 싶습니다. 모든 파일 이름을 쓰는 것은 옵션이 아닙니다. 파일 이름은 다음과 같습니다.

HAUPT_SIA_039.MR.NEUROPSYCHOLOGIE_LOGIN.0003.0001.2014.03.28.14.49.59.511530.47117493.IMA

시작은 항상 동일하고 .IMA도 동일합니다. 긴 숫자는 모든 파일에 대해 동일하지 않습니다. 모든 파일에 대해 039를 036_2로 변경해야 합니다. 나머지는 동일하게 유지되어야 합니다.

다음 명령과 기타 여러 명령을 모두 시도했지만 아무 작업도 수행되지 않았습니다.

cd my_directory

rename 's/\w039_2\w/\w036_2\w/g' * 

rename ?039_2? ?036_2? ?0_39_2?.IMA

rename 's/?039_2?/?036_2?/' ?039_2?.IMA

rename 's/\w039_2\w/\w036_2\w/' ?039_2?.IMA

Perl은 Linux 시스템에 설치되어 있습니다(그러나 어떻게 호출해야 할지 모르겠습니다... 왜냐하면 Perl 터미널을 열면 아무 일도 하지 않기 때문입니다).

도와주세요?

답변1

for file in * ; do mv $file $(echo $file | sed 's/_039/_036_2') ; done

설명:

for file in * ; do _______ ; done

*bash는 작업 디렉토리의 모든 파일을 나열하기 위해 쉘 확장을 수행합니다 . 이러한 각 파일에 대해 이 명령 구조는 변수를 file파일 이름과 동일하게 설정하고 및 사이에서 명령을 실행합니다 ; do.; done

mv $file _______

mv유닉스/리눅스에서 파일 이름을 바꾸는 전통적인 방법입니다. 다음 file으로 이름이 변경됩니다 ._______

echo $file | sed 's/_039/_036_2'

echo $file | sedfile간단히 " "를 의 표준 입력으로 보냅니다 sed. 여기서 sed"_036_2"를 "_039"로 대체합니다.

전체적으로: 현재 디렉터리의 모든 파일에 대해 "_036_2"를 "_039"로 대체하여 파일 이름을 바꿉니다.

답변2

귀하의 정규 표현식이 엉망입니다. 여기에 작동해야 하는 정규 표현식이 있습니다.

rename 's/HAUPT_SIA_039[.]\(.*\)/HAUPT_SIA_039_2.\1/g' HAUPT_SIA*.IMA

올바른 도구를 사용하고 있으므로 하위 디렉터리가 없으면 찾을 필요가 없습니다.


sed의 정규 표현식에 대해 참고하고 이름을 바꾸세요.

형식은 sXsearch_patternXreplace_patternXoptions( X어떤 문자라도 가능)입니다. searchPattern은 대체하려는 항목입니다. 대체하려는 항목이 아니라 이미 존재하는 항목입니다.

-w단일 단어이며 search_pattern에만 있을 수 있습니다.

답변3

찾다 . -이름 "*039*" | 's/039/036_2/g' 이름 바꾸기

답변4

"HAUPT_..." 접두사가 있는 모든 파일을 반복한 다음 쉘 하위 문자열을 사용하여 이름을 바꾸면 접두사 ${f:15}에 추가된 파일 이름의 15번째 문자에서 문자열이 반환됩니다 HAUPT_....

for f in "HAUPT_SIA_039*" ; do  mv $f "HAUPT_SIA_036_2${f:15}"; done

편집하다 - 모든 파일이 있는 디렉터리에는 동일한 HAUPT... 접두사가 붙은 하위 디렉터리도 포함되어 있는 것으로 보입니다. 이 경우 find명령을 사용하여 먼저 디렉터리가 아닌 파일만 필터링하십시오.

find . -type f -name "HAUPT_SIA_039*" | while read f; do mv $f "HAUPT_SIA_036_2${f:15}"; done

관련 정보