산술 계산에서 와일드카드 출력을 변수로 사용

산술 계산에서 와일드카드 출력을 변수로 사용

내 파일의 이름과 디렉터리 경로는 다음과 같습니다.

t10n2/data/file.dat0, t10n2/data/file.dat1, t10n2/data/file.dat2, ...

$1$2변수 및 in을 포함하는 t10n$1산술 연산을 사용하여 파일 dat$2이름을 로 변경하고 싶습니다 file.dat$(($1*5 + $2)).

특히 제가 알고 싶은 것은 산술 연산 !이나 변수의 출력에 와일드카드를 사용하는 방법이 아닐까 싶습니다. *나머지는 내가 할 수 있어요.

답변1

펄 사용하기 rename:

prename -n 's!t10n(\d+)/data/file.dat\K(\d+)!$1*5+$2!e' t10n*/data/file.dat*

-n결과가 만족스러우면 삭제하세요.

답변2

배시 사용:

for file in t10*/data/file.dat*
do
  if [[ $file =~ (t10n([[:digit:]]+)/data/file.dat)([[:digit:]]+) ]]
  then
    echo mv -- "$file" "${BASH_REMATCH[1]}$(( ${BASH_REMATCH[2]} * 5 + ${BASH_REMATCH[3]} ))"
  fi
done

어려운 작업은 테스트 작업 =~의 정규식 연산자에 의해 수행 됩니다 [[. 관심 있는 요소를 얻으려면 괄호로 묶인 세 가지 표현식이 있습니다.

  1. 대부분의 파일 이름,와는 별개로후행 dat숫자
  2. t10n숫자
  3. dat숫자

파일이 패턴과 일치하면 결과 값이 BASH_REMATCH 배열에 있으므로 이를 사용하여 새 파일 이름을 계산합니다.

echo결과가 정확해 보이면 삭제하세요.

입력 예:

mkdir -p t10n2/data t10n3/data
touch t10n2/data/{file.dat0,file.dat1,file.dat2}
touch t10n3/data/{file.dat0,file.dat1,file.dat2}

예제 출력:

mv -- t10n2/data/file.dat0 t10n2/data/file.dat10
mv -- t10n2/data/file.dat1 t10n2/data/file.dat11
mv -- t10n2/data/file.dat2 t10n2/data/file.dat12
mv -- t10n3/data/file.dat0 t10n3/data/file.dat15
mv -- t10n3/data/file.dat1 t10n3/data/file.dat16
mv -- t10n3/data/file.dat2 t10n3/data/file.dat17

답변3

그리고 zsh:

autoload zmv # best in ~/.zshrc
zmv -n 't10n(<->)/data/file.dat(<->)' '$f:r.dat$(($1 * 5 + $2))'

(만족스러우면 제거하세요 -n(드라이런의 경우)).

답변4

찾다+세게 때리다+sed해결책:

find . -type f -path "*t[0-9]*n[0-9]*/data/file.dat[0-9]*" -exec bash -c 'f=$1; 
      read v1 v2 < <(sed -E "s#.*/t[0-9]+n([0-9]+)/data/file\.dat([0-9]+)\$#\1 \2#" <<<"$f"); 
      mv "$f" "${f/.dat[0-9]*/.dat}$(($v1*5+$v2))"' x {} \;

  • read v1 v2 ...t10n<number>- 및 변수에서 각각 dat<number>주요 수치를 읽어옵니다 .v1v2

관련 정보