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 

하지만 파일 이름을 바꿀 수 없습니다. 내가 뭘 잘못하고 있니?

댓글

  • 가능한 중복 많은 이름을 어떻게 바꿀 수 있습니까? 정규식을 사용하는 파일의 개수?
  • 매개 변수 확장 대체 표현식의 오른쪽에 패턴 표현식이 '있을 수 없습니다. *가 어디에있을 것으로 예상 했습니까?
  • @Kiwy 그 질문은 파일 이름의 일부를 제거하는 것입니다. Ergo, 매우 의심스럽게 중복됩니다.
  • 다음에 변경하고 싶은 파일 이름을 설명해주세요. (차이점과 유사점을보기 전에이 부분을 잠시 살펴보아야했습니다). 예는 좋지만 설명 예가 더 좋습니다.

답변

이름 변경을 먼저 고려하는 것이 옳았습니다. “정규식에 익숙하지 않지만, 당신이 무엇을하고 있는지 알면 가장 빠른 / 가장 짧은 경로”라면 문법이 약간 이상합니다.

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 

댓글

  • 참고 이것이 Debian 및 파생 제품 (Ubuntu, Mint,…)의 Perl 이름입니다. 다른 Linux 배포에서 rename는 완전히 다른 파일 이름 변경 도구입니다 (Debian은 rename.ul로 제공됨).
  • 이러한 도구가 배포되지 않은 경우 @Michael Campbell 답변을 참조하십시오. 데비안처럼 모든 배포가 기본 rename를 대체한다고 생각합니다.

Answer

이 방법은 다음과 같습니다.

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

4 번째와 12 번째 문자 사이의 문자열을 “25032014”로 대체합니다.

댓글

  • for f in file*; do mv $f ${f/${f:4:4}/2503}; done도 작동합니다.
  • 그 ' 좋습니다. 단어 교체를 위해 일반 단어를 사용하려면 sed처럼 작동합니다. 예 : for f in *Huge*; do mv $f ${f/Huge/Monstrous}; done
  • @Eric-'가 더 명확하고 우아하다고 생각하기 때문에 답변을 대안으로 게시했습니다. . 답변으로도 게시하려면 ' 내를 삭제하겠습니다. 감사합니다!
  • 큰 따옴표가 누락 된 이유 는 무엇입니까?
  • 오류가 발생합니다. " mv : 대상 ' FILE_NAME '은 디렉토리가 아닙니다. "

Answer

이것은 정말로 위에서 본 @Eric의 답변입니다.하지만 우아한 답변입니다. 더 많은 관심을 끌 수 있도록 적절한 답변으로 다시 게시하고 있습니다.

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

답변

ptrn="file[0-9][0-9][0-9][0-9]2014[0-9][0-9][0-9][0-9][0-9].p" path=/dir ( set -- "${path}/"${ptrn} ; for f ; do { echo "mv ${path}/${f} \ ${path}/file25032014${f#2014}" } ; done ) 

이렇게하면 트릭이됩니다. 참고-나는 대량 mv 명령을 넘겨주는 버릇이 없습니다. 작성된대로”그냥 에코입니다. 당신 ” “작동하기 전에 분류해야합니다.

답변

루핑없이이를 수행하는 간단한 기본 방법입니다. 디렉토리 순회 :

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

파일이 제자리에 있습니다.

그리고 작품 아래 병렬화 :

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

댓글

  • 더 나은 솔루션을 상상하는 쉬운 첫 번째 접근 방법이었습니다. 작동 명령이 필요한 경우 :
  • find -type f -name "file*.p" | parallel 'ext="{}" ; mv -- {} ${ext:0:4}2503${ext:8}'

Answer

이런 일을 많이한다면 “rename.pl”을 찾아보십시오. “perl 스크립트이지만 단순히 perl 코드 (예 : /// 표현식)를 제공 할 수 있으며 해당 표현식 또는 코드를 기반으로 대량 이름 바꾸기를 수행합니다.

기본 버전이 있습니다. 여기 : http://stackoverflow.org/wiki/Rename.pl 하지만 다른 버전이 인터넷에 떠 있습니다. 그것은 오랜 세월 동안 존재 해 왔습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다