다음을 수행하는 것이 가능합니까?
g=$f:s/$in/$out/;
또는
g=$g:s/$in[$i]/$out[$i]/;
${~in}
나는 and 와 같은 임의의 문자 조합을 시도했지만 g=$g:ps/
보시다시피 저는 zsh 전문가가 아닙니다. 추측은 어떤 식으로든 나에게 도움이 되지 않습니다. :-) 맨 페이지를 읽어 보기도 했습니다...
편집: 나만의 zmv 유형 명령을 작성하려고 합니다.
# in a*b* -> a b NULL rn a*b* *c*d aXXbYY --> XXcYYd
# out *c*d -> NULL c d rn inv* mag* inv.ext inv.spc --> mag.ext mag.spc
alias rn='noglob frn'
function frn() {
local in out m n f g i
setopt localoptions glob histsubstpattern
in=("${(@s:*:)1}") # split $1 and $2 on '*'
out=("${(@s:*:)2}") # keeping NULL fields
m=${#in[@]} # count n(array-elements)
n=${#out[@]}
if [[ $m = $n ]] {
foreach f ($~1) # foreach file in globbed $1
g=$f
for (( i = 1; i < n; i += 1 )); do
g=$g:s/$in[$i]/$out[$i]/ # subst corresponding fields
done
g=$g:s/%$in[$i]/$out[$i]/ # last subst has % anchor
print '$f --> $g'
mv $f $g
end
} else {
print "n(*) must be same for both patterns"
}
}
답변1
$out
확장된 것과 달리 $in
이것은 리터럴 문자열로 처리되므로 아무 일도 일어나지 않습니다(리터럴이 f
포함되지 않는 한 $in
).
왼쪽으로 확장하려면 다음이 필요합니다.HIST_SUBST_PATTERN
놓다:
s/l/r[/]
r
아래 설명에 따라 교체하십시오l
.
...
기본적으로 대체의 왼쪽은 패턴이 아니라 문자열입니다. [...]
...이 옵션이 설정되면
파일 이름 생성 양식 패턴에 설명된 대로 평소대로 처리됩니다.HIST_SUBST_PATTERN
l
그래서
setopt histsubstpattern
그러면 제대로 작동할 텐데...
답변2
시도하고 다시 구현한 방법은 zmv -W
매우 취약합니다.
rfn a*b*c b*c*d
적용하기 전에 acrobatic
로 변경해야 합니다 bcrocatid
.
- a -> b
- b -> c
- c->d
지속적으로, 그러나 이로 인해 다음이 생성됩니다.
- 곡예 -> 곡예
- 곡예 -> 곡예
- 곡예 -> 곡예
zmv -W
그냥 똑같이 하세요
- 역참조를 활성화
a*b*c
하도록 모드 변경(#b)a(*)b(*)c
b*c*d
교체를 다음으로 변경하십시오 .b$match[1]c$match[2]d
- Korn 스타일 또는 csh-stype을 사용하여
${var/pattern/replacement}
교체를 수행 하거나 zsh 6.0+를 사용하여 교체를 수행합니다.$var:s/pattern/replacement
histsubstpattern
:S
수정자모드 유무에 관계없이 작동합니다histsubstpattern
.
function frn {
emulate -L zsh
set -o extendedglob
local glob=$1 replacement=$2 n=0 file newfile
pattern=${glob//'*'/'(*)'}
replacement=${replacement//(#m)'*'/\$match[$((++n))]}
for file ($~glob) {
newfile=${file/#%(#b)$~pattern/${(Xe)replacement}}
if [[ -n $newfile && $file != $newfile ]] {
print -ru2 -- "${(q+)file} -> ${(q+)newfile}"
# mv -- $file $newfile
}
}
}
alias frn='noglob frn'
그 다음에:
$ frn a*b*c b*c*d
acrobatic -> bcrocatid
그것은 다음과 같습니다:
$ alias zmvw='noglob zmv -W'
$ zmvw -n a*b*c b*c*d
mv -- acrobatic bcrocatid
zmv
더 많은 와일드카드를 처리할 수 있을 뿐만 아니라 *
더 많은 온전성 검사 및 오류 처리도 수행할 수 있습니다.