移动文件 shell 脚本

移动文件 shell 脚本

我有一个 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删除字符串,然后将字符串附加到结果的末尾。.PK2name.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。目标allforce是虚假的 => 目标将始终被重建,在我们的例子中,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 文件扩展名的映射存储到新扩展名中。

$srccontains name.PK1 ${src%.*}contains name ${src#${src%?}}contains1 因此dest被评估为“name”“.” “BRD”=“名称.BRD”

相关内容