내 파일의 이름과 디렉터리 경로는 다음과 같습니다.
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
어려운 작업은 테스트 작업 =~
의 정규식 연산자에 의해 수행 됩니다 [[
. 관심 있는 요소를 얻으려면 괄호로 묶인 세 가지 표현식이 있습니다.
- 대부분의 파일 이름,와는 별개로후행
dat
숫자 t10n
숫자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>
주요 수치를 읽어옵니다 .v1
v2