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

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

그래서 중첩된 폴더가 있는 디렉터리가 있고 어느 시점에는 .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

perl's 의 변형 중 하나를 사용하십시오 rename. 예를 들어,하나( renameDebian 계열 시스템의 패키지):

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_bardir_1_2_3/file_12_foo_2234_bar

_패턴 을 따르는 일반 파일에서 두 번째 파일만 제거하려면 letters_digits_digits_letters.png다음과 같습니다.

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

관련 정보