我有一个 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
有什么理由使用$1
infor 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 监视目录中特定扩展名的文件的创建