我的文件的名称和目录路径如下:
t10n2/数据/文件.dat0, t10n2/数据/文件.dat1, t10n2/数据/文件.dat2, ...
$1
我希望使用涉及变量and $2
int10n$1
和 的算术运算来更改文件名dat$2
,以便将文件名更改为file.dat$(($1*5 + $2))
.
特别是,我想我想知道的是如何在算术运算中使用通配符!
或作为变量的输出?*
剩下的我可以做。
答案1
使用 Perl rename
:
prename -n 's!t10n(\d+)/data/file.dat\K(\d+)!$1*5+$2!e' t10n*/data/file.dat*
-n
当您对结果满意时删除。
答案2
使用bash:
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