그래서 중첩된 폴더가 있는 디렉터리가 있고 어느 시점에는 .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
. 예를 들어,하나( rename
Debian 계열 시스템의 패키지):
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'