Bash 스크립트를 사용하여 여러 파일 이름 바꾸기

Bash 스크립트를 사용하여 여러 파일 이름 바꾸기

Bash 스크립트를 사용하여 동일한 디렉터리에 있는 여러 파일의 이름을 바꾸고 싶습니다. 파일 이름은 다음과 같습니다.

file2602201409853.p
file0901201437404.p  
file0901201438761.p  
file1003201410069.p  
file2602201410180.p

다음 형식으로 이름을 바꾸고 싶습니다.

file2503201409853.p
file2503201437404.p  
file2503201438761.p  
file2503201410069.p  
file2503201410180.p

rename 명령에 대해 읽고 시도해 보았지만 아무것도 수행되지 않았으며 구문에 문제가 있는 것 같습니다. 그런 다음 당신이 사용할 수 있다는 것을 읽었습니다.MV명령은 다음과 같습니다.

for file in cmpsms*2014*.p; do
    mv "$file" "${file/cmpsms*2014*.p/cmpsms25032014*.p}"
done

하지만 이 파일의 이름을 바꿀 수는 없습니다. 내가 뭘 잘못했나요?

답변1

먼저 이름 변경을 고려하는 것이 옳습니다. 정규식에 익숙하지 않은 경우 구문이 약간 이상하지만, 일단 수행 중인 작업을 알고 나면 가장 빠르고 가장 짧은 경로가 됩니다.

rename 's/\d{4}/2503/' file*

이것은 단지 처음 4개의 숫자와 일치하고 이를 사용자가 지정한 숫자로 바꿉니다.

및 테스트 하네스( -vn자세한 ​​내용을 의미하지만 그렇지 않음)하다무엇이든) 파일 이름을 사용하여:

$ rename 's/\d{4}/2503/' file* -vn
file0901201437404.p renamed as file2503201437404.p
file0901201438761.p renamed as file2503201438761.p
file1003201410069.p renamed as file2503201410069.p
file2602201409853.p renamed as file2503201409853.p
file2602201410180.p renamed as file2503201410180.p

답변2

이렇게 하면 트릭을 수행할 수 있습니다.

for f in file*; do mv $f ${f/${f:4:8}/25032014}; done

4~12번째 문자 사이의 문자열을 "25032014"로 바꿉니다.

답변3

이것은 실제로 위의 @Eric의 답변입니다. 하지만 우아한 답변이므로 더 많은 관심을 끌기 위해 정답으로 다시 게시하고 있습니다.

for f in *Huge*; do mv "$f" "${f/Huge/Monstrous}"; done

답변4

반복 없이 이 작업을 수행하는 간단한 기본 방법은 다음과 같습니다.디렉토리 순회:

find -type f | xargs -I {} mv {} {}.txt

모든 파일의 이름이 변경됩니다.

아래는 실제 예시입니다병렬화:

find -name "file*.p" | parallel 'f="{}" ; mv -- {} ${f:0:4}2503${f:8}'

관련 정보