用于重命名文件的 shell 脚本

用于重命名文件的 shell 脚本

我有一个 shell 脚本:

#!/bin/bash
for name in /home/imp/imp/msgs/$1.PK1; do
    mv "$name" "${name%.PK1}.BRD" 2>/dev/null >/dev/null
done
for name in /home/imp/imp/msgs/$1.PK2; do
    mv "$name" "${name%.PK2}.MIX" 2>/dev/null >/dev/null
done

它有效,但仅适用于预先存在的文件。所发生的情况是,在初始扫描后会创建更多*.PK1和。*.PK2我希望这个脚本“循环”并重命名之后创建的文件。这可能吗?

更新:

这就是我现在所拥有的:

#!/bin/bash

while [ ! -z "$(ls *.PK1 *.PK2 2>/dev/null)" ]; do

for name in /home/imp/imp/msgs/$1.PK1; do
    mv "$name" "${name%.PK1}.BRD" 2>/dev/null >/dev/null
done
for name in /home/imp/imp/msgs/$1.PK2; do
    mv "$name" "${name%.PK2}.MIX" 2>/dev/null >/dev/null
done
sleep 1; done

那是对的吗?

谢谢。

答案1

有什么理由使用$1infor name in /path/$1.PK1而不是 just吗for name in /path/*.PK1?您是否故意将全局模式传递给脚本?

如果您想捕获带有这些后缀的所有文件以及出现的新文件,Bash 中的一个简单解决方案将如下所示:

shopt -s nullglob
dir=/home/imp/imp/msgs
while true ; do
    for name in "$dir/"*.PK1; do
        mv "$name" "${name%.PK1}.BRD" 2>/dev/null >/dev/null
    done
    for name in "$dir/"*.PK2; do
        mv "$name" "${name%.PK2}.MIX" 2>/dev/null >/dev/null
    done
    sleep 1
done

如果你想避免做额外的工作,你可以(在 Linux 上)使用类似inotifywait等待新文件出现的方法,例如如下所示: 如何使用 inotifywait 监视目录中特定扩展名的文件的创建

相关内容