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
하지만 파일 이름을 바꿀 수 없습니다. 내가 뭘 잘못하고 있니?
댓글
답변
이름 변경을 먼저 고려하는 것이 옳았습니다. “정규식에 익숙하지 않지만, 당신이 무엇을하고 있는지 알면 가장 빠른 / 가장 짧은 경로”라면 문법이 약간 이상합니다.
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 하지만 다른 버전이 인터넷에 떠 있습니다. 그것은 오랜 세월 동안 존재 해 왔습니다.
*
가 어디에있을 것으로 예상 했습니까?