정규식을 사용하여 파일 이름 바꾸기

정규식을 사용하여 파일 이름 바꾸기

내 Linux 컴퓨터의 폴더에는 다음과 같은 이름의 파일이 많이 있습니다.

11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 31, 32, 33, 34, 35

정규식을 사용하여 .inp 확장자로 이름을 바꾸고 싶습니다.

나는 노력했다

mv * *.inp
mv: target '*.inp' is not a directory

오류가 발생합니다. 또한 * 대신 정규식 [123][12345]을 사용해 보았습니다.

그래서 나는 mv가 파일을 이동하는 데 사용된다는 것을 이해합니다. 또한 ./*.inp mv를 동일한 폴더에 쓰 도록 강제할 수도 있다고 생각했지만 실패했습니다. 그렇다면 어떻게 작동하는지 제대로 이해하지 못하는 mv것 외에 어떻게 이 작업을 수행할 수 있을까요 mv?

답변1

명령의 문제점은 mv단일 파일(정확히 두 개의 명령줄 인수가 제공된 경우)만 이동하거나 이름을 바꾸거나 여러 파일을 단일 대상 디렉터리(두 개 이상의 명령줄 인수)로 이동할 수 있다는 것입니다.

귀하의 경우 확장자를 * *.inp인수로 사용하고 있으며, 이는 현재 디렉토리에 표시되는 모든 파일 이름으로 확장되고 그 뒤에 일치하는 이름이 옵니다 *.inp. 이것이 세 개 이상의 이름으로 확장된다고 가정하면 명령이 유효한 명령이 되려면 마지막 매개변수가 디렉터리 이름이어야 합니다. mv그렇지 않으면 "디렉토리가 아님" 오류가 발생합니다.

이 경우 우리는 mv한 번에 두 개의 인수를 사용하고 이를 위해 쉘 루프를 사용해야 합니다:

for name in [123][1-5]; do
    mv "$name" "$name.inp"
done

이것은 언급한 파일 이름 와일드카드 패턴(변형)과 일치하는 모든 이름을 반복합니다(참고, 이것은 정규식이 아닙니다). 루프 본문에서 현재 이름은 변수에 저장되며 name이름 mv끝에 추가하여 파일 이름을 간단히 바꿀 수 있습니다..inp

mv이름 충돌 가능성이 있는 경우 기존 파일을 덮어쓰는 것을 방지할 수는 없습니다 . 이를 위해 GNU를 사용한다고 가정하면 해당 (또는 ) 옵션 과 함께 사용해야 하거나 (또는 ​​) 옵션 과 함께 사용해야 mv할 수도 있습니다 .mv--no-clobber-n--backup-b

또는 대상 이름이 존재하는지 명시적으로 확인하고 존재하는 경우 현재 파일을 건너뛸 수 있습니다. 또한 대상 이름과 동일한 이름을 가진 디렉토리가 있는 경우 파일을 기존 디렉토리로 이동하는 것을 방지합니다.

for name in [123][1-5]; do
    [ -e "$name.inp" ] || [ -L "$name.inp" ] && continue
    mv "$name" "$name.inp"
done

GNU를 (또는) mv과 함께 사용 하거나 기존 파일 덮어쓰기(또는 백업)를 방지하고 대상 이름과 이름이 같은 하위 디렉터리로 파일을 이동하는 것도 방지합니다.--no-target-directory-T-n-b-b

답변2

다음 도구를 사용할 수 있습니다 perl-rename.

rename -n 's/$/.inp/' [0-9][0-9]

(또는 정규식을 평가할 필요가 없으므로 더 빠른 '$_ .= ".inp"'추가를 사용하십시오.).inp

-n출력이 만족스러우면 삭제하세요.

답변3

zsh일괄 이름 바꾸기 기능 사용 zmv:

autoload -Uz zmv
zmv '[1-3][1-5]' '$f.inp'

여기에 언급된 다른 솔루션에 비해 장점은 다음과 같습니다.

  • 먼저 몇 가지 온전성 검사를 실행합니다. 예를 들어 이로 인해 데이터가 손실될 수 있는 경우 명령을 실행하기 전에 명령을 중단합니다.어느이름을 바꿉니다.
  • [1-5][12345]와 동일합니다 zsh. bash가장 일반적인 로케일과 GNU 시스템 에서는 [1-5]다음과 같습니다 .[12345١٢٣٤۱۲۳۴߁߂߃߄१२३४১২৩৪੧੨੩੪૧૨૩૪୧୨୩୪௧௨௩௪౧౨౩౪౹౺౻౼౽౾೧೨೩೪൧൨൩൪෧෨෩෪๑๒๓๔໑໒໓໔༡༢༣༤༪༫༬༭၁၂၃၄႑႒႓႔፩፪፫፬១២៣៤៱៲៳៴᠑᠒᠓᠔᥇᥈᥉᥊᧑᧒᧓᧔᧚᪁᪂᪃᪄᪑᪒᪓᪔᭑᭒᭓᭔᮱᮲᮳᮴᱁᱂᱃᱄᱑᱒᱓᱔⁴₁₂₃₄⅐⅑⅒⅓⅔⅕⅖⅗⅘⅙⅛⅜⅟①②③④⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳⑴⑵⑶⑷⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇⒈⒉⒊⒋⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⓫⓬⓭⓮⓯⓰⓱⓲⓳⓴⓵⓶⓷⓸⓾❶❷❸❹❿➀➁➂➃➉➊➋➌➍➓〡〢〣〤㉈㉉㉊㉋㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㋀㋁㋂㋃㋉㋊㋋㍙㍚㍛㍜㍢㍣㍤㍥㍦㍧㍨㍩㍪㍫㍬㍭㍮㍯㍰㏠㏡㏢㏣㏩㏪㏫㏬㏭㏮㏯㏰㏱㏲㏳㏴㏵㏶㏷㏸㏹㏺㏻㏼㏽㏾꘡꘢꘣꘤꣑꣒꣓꣔꤁꤂꤃꤄꧑꧒꧓꧔꧱꧲꧳꧴꩑꩒꩓꩔꯱꯲꯳꯴1234

답변4

배포판에 사용 가능한 경우 mmv 명령을 사용하십시오.

예시 보기http://manpages.ubuntu.com/manpages/bionic/man1/mmv.1.html

관련 정보