在我的 bash 脚本中,我想根据新写入的文件名和.dat
格式更新字符串。这是我正在尝试做的事情:
- 例如,我使用
blabla_3200.dat
bash 脚本中命名的文件,然后使用该脚本运行一个案例。 - 本例做完后,
blabla_3300.dat
在同一个目录下写入一个新的 - 对于下一次运行,我想
blabla_3300.dat
在同一个 bash 脚本中使用最后一个。
因此,我必须搜索文件名中的最大整数.dat
,然后使用sed
它来更新我的 bash 脚本,例如:
sed -i 's/3200/max/g' mybash.sh
然后运行一个新的案例。
任何帮助将不胜感激祝你有美好的一天!
清除注释
我应该更清楚:
假设我在同一目录中有blabla_3200.dat
, submission.sh
, 。bash.sh
我告诉这个程序submission.sh
;read data blabla_3200.dat
然后开始跑步。
要将此submission.sh
文件调用到 slurm 机器,我sbatch submission.sh
命令bash.sh
然后结束运行,程序blabla_4500.dat
在同一目录中写入输出文件(不知道会写入什么,例如可能是 blabla_8254.dat)。
我想要什么这个;每次新输出出现后,bash.sh 中的代码应更新submission.sh 中的读取数据命令。现在在submission.sh中,read data blabla_4500.dat
应该被命令。
答案1
使用软链接ln -s blabla_3300.dat .next
。
.next
然后告诉你的脚本读取rm .next;ln -s blabla3400.dat .next
。
答案2
我提出了一个简单的示例,用于计算目录中出现的每个文件的 SHA256 哈希值。无害且易于验证是否出错。您可以使用任何其他处理。
#!/bin/sh
inotifywait -m "$@" -e create | while read dir event file; do
if [ -f "${dir}${file}" ]; then
sha256sum "${dir}${file}"
fi
done
这存在一些问题,并非所有问题都容易解决。
- 如果文件名中有换行符怎么办?它将把它们作为两个独立的元素进行处理,更糟糕的是,无论谁编写这些文件都可以强制脚本处理任意其他文件。理论上,您可以使用
\0
- 唯一不能出现在文件名中的字符 - 作为分隔符,但我无法使用它$IFS
和--format
选项。也许最好不要使用-m
而是重复调用inotifywait,这样您就知道一个输出=一个文件。但那样你就会错过很多活动! - 快速创建并快速删除文件会错过事件。实际上比这更糟糕。有人可以创建一个常规文件,然后执行您的脚本
[ -f ${dir}${file} ]
,然后删除它并创建一个符号链接,然后您的脚本对任意文件执行操作。因此,即使我让\0
事情正常运转,也没关系。 - 处理速度慢。如果处理的时间比创建文件的时间长,就会出现很大的延迟,使上述问题变得更加严重。这可以通过放置良好的位置轻松修复
&
:) - 读取写了一半的文件。
close_write
通过使用该事件,或者在其他地方创建文件并在完成后将它们移动到受监视的目录,可以避免这种情况。
我认为这是不应该在 shell 脚本中完成的任务之一。这里的读者和作者之间需要某种同步,并且可能存在也可能不存在信任边界。