Bash 와일드카드 변수 대체? [복사]

Bash 와일드카드 변수 대체? [복사]

중복 가능성:
일괄 이름 바꾸기 파일

기존 이름을 기반으로 새 이름을 사용하여 파일 이름을 바꾸고 싶습니다.

ls그래서 이 파일을 사용할 수 있다면

ls blue*+(.png)

이름을 다음으로 바꾸고 싶습니다.

mv blue$(*)+(.png) $(1).png

그러나 이것은 분명히 작동하지 않습니다. bash globbing에 이러한 변수에 대한 구문이 있습니까, 아니면 더 쉬운 방법이 있습니까?

답변1

이를 달성하는 휴대용 방법은 다음과 같습니다.

for f in blue*.png; do mv -- "$f" "${f#blue}"; done

mv이 모든 것이 필요하며 bash모든 POSIX 호환 셸에서 실행될 수 있습니다.표준 POSIX 매개변수 확장. 시스템에 설치된 zsh특정 버전이 없습니다 rename.

답변2

Bash에서 이 작업을 수행하는 쉬운 방법은 없지만 물론 접두사 제거, 확장명 기억, 확장명의 여러 인스턴스를 단일 확장명으로 바꾸는 등의 단계로 문제를 나눌 수 있습니다.

for file in blue*+(.png); do tmp="${file#blue}"; extension="${file##*.}"; echo "$file" "${tmp/%+(.$extension)/}.$extension";done

결과가 만족스러우면 입력하세요.

^echo^mv

모든 마법이 일어납니다. :)

답변3

배시 사용:

zsh -c '
  autoload -U zmv
  zmv "blue(*).png" "\$1.png"'

;-). 또는 더 심각하게 말하면, zsh의 zmv는 다양한 이름 바꾸기 작업을 위한 매우 강력한 도구라는 것을 알게 될 것입니다. 여러분이 생각해낸 스크립트와는 달리 이 도구(또는 mmv나 이름 바꾸기 같은 작업 전용 도구)는 파일이 손상되지 않도록 각별히 주의하며 극단적인 경우에 더 강력할 가능성이 높습니다.

답변4

Debian 및 그 파생 제품(Ubuntu 포함)에는 원하는 작업을 수행하는 이름 바꾸기 명령이 있습니다.

rename -n "s/\+\.png/.png/" blue*+.png

실제로 이름 바꾸기를 적용하려면 테스트 후 -n 플래그를 제거하십시오.

이 명령은 Perl 스크립트이므로 util-linux 제품군의 명령과 혼동하지 마십시오 rename. rename다른 배포판에서는 이를 제공할 수도 prename있고 rename.pl전혀 제공하지 않을 수도 있습니다.

관련 정보