한 줄 명령으로 파일 이름 바꾸기


10

이 디렉토리가 있고 파일 이름을 바꾸고 싶습니다.

===> ls -1 Der-vierte-Weise/
10 - 10 - Erkenntniss.ogg
1 - 01 - Hoffnung.ogg
11 - 11 - Wahrheit.ogg
12 - 12 - Dankbarkeit.ogg
13 - 13 - Kredits.ogg
2 - 02 - Familie.ogg
3 - 03 - Demut.ogg
4 - 04 - Freude.ogg
5 - 05 - Schoenheit.ogg
6 - 06 - Solidaritaet.ogg
7 - 07 - Entscheidung.ogg
8 - 08 - Hilfe.ogg
9 - 09 - Unterstuetzung.ogg

결과는 다음과 같아야합니다.

===> ls -1 Der-vierte-Weise/
01 - Hoffnung.ogg
02 - Familie.ogg
...

일반적인 쉘 도구 로이 문제를 해결하고 싶습니다.


1
일반적인 쉘 도구 로이 문제를 해결하고 싶습니다. 나는 당신이 타당한 이유가 없다고 말하지는 않지만, 당신이 "왜?"라는 질문을하고 자신에게 질문 한 것을 믿습니다. 마지막으로 나는 비슷한 문제를 해결하기 위해 Bash를 즉시 한쪽으로 밀고 파이썬으로 해결했습니다. 훨씬 더 쉽습니다 (그러나 파이썬, 문자열 메소드, glob.glob 및 os.rename을 이미 알고 있었으며 공백과 다른 어색한 문자가있는 폴더 이름으로 가득 찬 나무를 재귀 적으로 만들어야했습니다. python을 사용하는 경우 귀찮게)
nigel222

1
@ nigel222 게으르고 가능한 한 적은 문자를 입력하고 싶습니다. 그렇기 때문에 여기서 파이썬을 사용하고 싶지 않습니다. 내가 틀리지 마 지금까지 파이썬은 내가 선호하는 프로그래밍 언어이며 매일 사용합니다.
guettli

답변:


18

당신은 사용할 수 있습니다 rename...

rename -n 's/^[0-9]+ - //' *

-n실제로 파일 이름을 바꾸려면 테스트 후 제거

설명

  • s/old/new/교체 oldnew
  • ^ 문자열의 시작
  • [0-9]+ 일부 숫자

rename도구 는 어떤 종류의 정규식 꽃을 지원합니까 ? PCRE를 사용합니까? ... 좋을 것이다.
guettli

5
@guettli 엄밀히 말하면 PCRE가 아닙니다 (Perl 호환 정규 표현식). 이것은 renamePerl 스크립트이므로 완전한 Perl 정규식 지원을 갖습니다. PCRE는 그 중 일부일뿐입니다. 그러나 PCRE에서 아는 모든 내용은에 적용됩니다 rename.
terdon

@ terdon 구현에 관심이 없습니다. 수학 안경으로 보면 rename펄 호환 정규 표현식이 있습니다. 예, pcre 구현은 사용되지 않습니다. 나는 이것을 이해했다 :-) 빠른 답변 감사합니다.
guettli

9

bash 시작 부분에서 필요한 부분을 제거하기위한 매개 변수 확장 :

for f in *[[:blank:]]*.ogg; do echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

확장 양식 :

for f in *[[:blank:]]*.ogg; do 
    echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"
done

echo드라이 러닝 용입니다. 실제 행동을 위해 그것을 제거하십시오 :

for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

예:

% ls -1
1 - 01 - Hoffnung.ogg
2 - 02 - Familie.ogg

% for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done 

% ls -1                                                                             
01 - Hoffnung.ogg
02 - Familie.ogg

예, 작동합니다. 감사합니다. 파이썬에서 펄 호환 정규 표현식을 알고 있기 때문에 (매일 사용) rename명령을 선호합니다 . (입력이 덜 필요함).
guettli

1
@guettli rename는 PCRE에 익숙하다면 갈 길입니다. rename대답은 이미 주어진 순수로 이동해야했다 bash. 참고로 pythonre(또는 regex) 모듈은 PCRE와 완전히 호환되는 BTW가 아닙니다.
heemayl

@guettli 또한 당신은 내 대답을 downvoted 했습니까? : O
heemayl

그렇습니다, 나는 당신의 의견을 찬성했습니다. 개인적으로 받아들이지 않기를 바랍니다. 나를 틀리지 말아라. 그러나 나의 개인적인 의견은 이것이 ${f#[[:digit:]]*-[[:blank:]]}추악 하다는 것이다 . 그렇습니다. 그러나 우리는 21 세기에 살고 있습니다. "작동"에서 "쉽고 재미있다"로 전환 할 때가되었다고 생각합니다. "작동하는"것이 목표라면, 리눅스는 사용자 친화적이지 않다는 편견을 풀지 않을 것입니다. 이미 많은 투표를 했으므로이 투표는 아프지 않아야합니다. 그럴 경우 말해주십시오. 다시 가져갑니다.
guettli

1
@guettli 무엇이 당신에게 어울립니다. 여기 : gnu.org/software/bash/manual/html_node/... 노트, 문자 클래스에 그냥을 [[:digit:]]하고 [[:blank:]]거기 준수하기 위해이 있었다 locale,이 역시 정규식에 매우 일반적이다.
heemayl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.