我有一个 shell 脚本ren.sh
#!/bin/bash
/usr/bin/mv /home/imp/imp/msgs/$1.PK1 /home/imp/imp/msgs/$1.BRD
/usr/bin/mv /home/imp/imp/msgs/$1.PK2 /home/imp/imp/msgs/$1.MIX
它工作正常,但一次只能移动 2 个文件(*.PK2
和*.PK1
)。我希望它将所有现有的*.PK1
和*.PK2
文件移动到*.MIX
和*.BRD
文件
这可能吗?
答案1
是的。
for name in /home/imp/imp/msgs/*.PK1; do
mv "$name" "${name%.PK1}.BRD"
done
for name in /home/imp/imp/msgs/*.PK2; do
mv "$name" "${name%.PK2}.MIX"
done
第一个循环将迭代其*.PK1
下的所有文件/home/imp/imp/msgs
,并将文件名后缀替换为.BRD
.
第二个循环对另一组文件执行类似的操作。
变量扩展将从变量中存储的值的末尾${name%.PK2}.MIX
删除字符串,然后将字符串附加到结果的末尾。.PK2
name
.MIX
答案2
cat - <<\eof | make -f - SRCDIR="/home/imp/imp/msgs"
.PHONY:all force
all:$(wildcard $(SRCDIR)/*.PK[12]);
%.PK1:force;/usr/bin/mv "$@" "$(@:.PK1=.BRD)";
%.PK2:force;/usr/bin/mv "$@" "$(@:.PK2=.MIX)";
eof
cat 命令即时构建 makefile。目标all
和force
是虚假的 => 目标将始终被重建,在我们的例子中,mv
每次都会运行。建立$(wildcard ...)
所有必需文件的列表*.PK1, *.PK2
。
答案3
set -- "BRD" "MIX"
for src in /home/imp/imp/msgs/*.PK[12]; do
eval "dest=\${src%.*}.\${${src#${src%?}}}"
/usr/bin/mv "$src" "$dest"
done
基本思想是我们通过“$@”数组将 src 文件扩展名的映射存储到新扩展名中。
$src
contains name.PK1
${src%.*}
contains name
${src#${src%?}}
contains1
因此dest
被评估为“name”“.” “BRD”=“名称.BRD”