![Bash 쉘에서 많은 파일의 이름을 바꾸는 방법은 무엇입니까?](https://rvso.com/image/1416382/Bash%20%EC%89%98%EC%97%90%EC%84%9C%20%EB%A7%8E%EC%9D%80%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EB%B0%94%EA%BE%B8%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
질문해서 죄송합니다. 인터넷을 많이 검색했지만 효과가 있는 답변을 찾을 수 없었습니다(제안 사항이 많았음에도 불구하고).
그래서 많은 파일의 이름을 바꾸고 싶습니다. 모든 파일 이름을 쓰는 것은 옵션이 아닙니다. 파일 이름은 다음과 같습니다.
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 | sed
file
간단히 " "를 의 표준 입력으로 보냅니다 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