
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}'