파일 이름에서 접두사 제거


10

다음과 같이 많은 파일이 있습니다.

04602635_b0294.DAT20120807164534
04602637_b0297.DAT20120807164713
04602638_b0296.DAT20120807164637
04602639_b0299.DAT20120807164819
04602640_b0298.DAT20120807164748
04602641_b0300.DAT20120807164849
04602650_b0301.DAT20120807164921
04602652_b0302.DAT20120807164956

접두사를 제외하려면 이름을 바꿔야합니다. 이렇게 생겼어야 해요 ..

b0294.DAT20120807164534
b0297.DAT20120807164713
b0296.DAT20120807164637
b0299.DAT20120807164819
b0298.DAT20120807164748
b0300.DAT20120807164849
b0301.DAT20120807164921
b0302.DAT20120807164956

편집하다

Solaris를 사용하고 있음을 추가하는 것을 잊었습니다.

답변:


19
for file in * ; do
    echo mv -v "$file" "${file#*_}"
done

모든 것이 정상임을 만족시키기 위해 이것을 실행하십시오.
그렇다면 echo명령 에서 제거 하면 원하는대로 파일 이름이 바뀝니다.

"${file#*_}"

쉘의 일반적인 대체 기능입니다. 첫 번째 _기호 앞의 모든 문자를 제거합니다 (기호 자체 포함). 자세한 내용은 여기 를 참조 하십시오 .


정확히 무슨 일이 일어나고 있는지 설명해 주 "${file#*_}"시겠습니까?
Pieter van Niekerk

내 답변에 설명을 추가했습니다.
돌진

IMO, 대부분의 모든 스크립트는 원하는 명령 출력을 반영하도록 작성되어야합니다. 그러나를 제거하지 말고 echo스크립트 출력을에 파이프하십시오 bash.
Jim L.

7

rename이 도구 를 사용할 수 있습니다 :

rename "s/.*_//" *

추가 -n하면 이름이 바뀌지 않고없이 수행 된 작업을 보여줍니다 -n.

rush의 의견에 대한 응답으로 : my renameis는 실제로 prename데비안 및 우분투 perl패키지 와 함께 제공 되는 링크 입니다.


5
rename서로 다른 시스템에서 항상 같은 것은 아니며 구문이 다를 수 있습니다.
돌진

1
asker는 이제 그가 Solaris를 사용하고 있다고 덧붙였습니다. 따라서이 이름 변경 명령 ​​(데비안 및 파생 제품에만 해당)을 사용할 수 없습니다.
Gilles 'SO- 악마 그만해'

1
... 소스에서 빌드하지 않는 한.
sendmoreinfo

@Gilles perl-rename는 데비안에 국한되지 않습니다. 그것은 방금 전화 아니에요 rename하지만 perl-renameprename다른 배포판에. 그것은 항상 repos에 있어야하고 하나는 perl함께 설치됩니다 .
terdon

@terdon 기본 사용법이 perl 표현식 인 파일의 이름을 바꾸는 명령 은 데비안에 국한되지 않습니다. 그냥 호출되지 않은 패키지를 명시 적으로 요청하지 않고 호출 rename되고 설치 될 가능성이있는rename 이러한 명령 은 데비안에만 해당됩니다. 다른 Linux 배포판은 명령을 호출 prename하거나 perl-renameutil-linux와의 혼동을 피하고 renameperl 패키지와 함께 번들로 묶지 않으며, 이름으로 제공 하거나 Linux로 배포하는 Linux 이외의 유닉스를 알지 못합니다 rename. 모든 이름으로 기본 설치.
Gilles 'SO- 악마 그만'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.