그래서 중첩된 폴더와 특정 시점의 이미지가 있는 디렉토리가 있습니다 .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
데비안 시스템의 소프트웨어 패키지와 유사):
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'