디렉토리의 모든 파일에서 두 숫자 사이의 밑줄을 제거하는 방법

디렉토리의 모든 파일에서 두 숫자 사이의 밑줄을 제거하는 방법

그래서 중첩된 폴더와 특정 시점의 이미지가 있는 디렉토리가 있습니다 .png.

이미지 이름은 "letters_numbers_numbers_letters.png"와 같이 지정되며 숫자 사이의 밑줄을 제거하고 싶습니다.

이라는 파일이 있고 a_1_2_b.png이름을 로 바꾸고 싶다고 가정해 a_12_b.png보겠습니다. 다음과 같은 것을 사용해야 합니다.

find . -name "*[0-9]_[0-9]* -type f -exec bash -c <enter_code here>`

하지만 이 특정 밑줄을 제거하는 방법을 지정하는 방법을 잘 모르겠습니다. 건드리고 싶지 않은 밑줄이 두 개 더 있다는 것을 기억하세요.

미리 감사드립니다!

답변1

perls 변형 중 하나를 사용하십시오 rename. 예를 들어,저것( rename데비안 시스템의 소프트웨어 패키지와 유사):

LC_ALL=C find . -name '*[0-9]_[0-9]*' -type f -exec rename -n -d '
  s/(?<=\d)_(?=\d)//g' {} +

(만족하면 삭제하세요 -n(모의 실행)).

이를 통해 zsh다음을 수행할 수 있습니다.

autoload -Uz # best in ~/.zshrc
zmv -n  '(**/)(*[0-9]_[0-9]*)(#qD.)' \
        '$1${2//(#m)[0-9][_0-9]#[0-9]/${MATCH//_}}'

zsh glob에는 Perl의 둘러보기 정규식 연산자와 동등한 것이 없기 때문에 약간 복잡합니다.

이는 _모든 일반 파일 이름에서 숫자로 둘러싸인 모든 s를 제거합니다(예: dir_1_2_3/file_1_2_foo_22_3_4_bar파일 이름을 로 변경).dir_1_2_3/file_12_foo_2234_bar

_이 패턴을 따르는 일반 파일 중 두 번째 파일만 삭제하려면 letters_digits_digits_letters.png다음을 수행하세요.

zmv -n '(**/)([[:alpha:]]##_<->)_(<->_[[:alpha:]]##.png)(#qD.)' \
       '$1$2$3'

관련 정보