如何根据写入的 .dat 文件名更改 bash 脚本中的整数

如何根据写入的 .dat 文件名更改 bash 脚本中的整数

在我的 bash 脚本中,我想根据新写入的文件名和.dat格式更新字符串。这是我正在尝试做的事情:

  • 例如,我使用blabla_3200.datbash 脚本中命名的文件,然后使用该脚本运行一个案例。
  • 本例做完后,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.shread 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 脚本中完成的任务之一。这里的读者和作者之间需要某种同步,并且可能存在也可能不存在信任边界。

相关内容