linux - 如何同时运行两个 bash 脚本而不重复相同的操作?

标签 linux bash macos scripting

我正在尝试编写一个自动运行数据分析程序的脚本。数据分析获取一个文件,对其进行分析,并将所有输出放入一个文件夹中。该程序可以同时在两个终端上运行(每个终端分析不同的主题文件)。

我写了一个可以自动完成所有输入的脚本。但是,我只能让我的脚本自动运行一个。如果我同时运行我的脚本,它会分析同一个主题两次(无用)

目前,我的脚本如下所示:

for name in `ls [file_directory]`
do

    [Data analysis commands]

done

如果您在两个终端上运行它,它将从包含所有数据文件的目录的顶部开始。这是个问题,所以我尝试检查重复项,但效果不佳。

我尝试使用 if 命令进行名称比较(没有成功,因为除了一个文件之外的所有输出文件都具有唯一的名称,因此它会检查目录顶部的第一个输出文件夹并说名称不同即使更下方的输出文件夹具有相同的名称)。它看起来像..

for name in `ls <file_directory>`
do
     for output in `ls <output directory>`  
     do
          If [ name==output ]
          then
               echo "This file has already been analyzed."
          else
               <Data analyis commands>
          fi
     done
done

我认为这是正确的方法,但显然不是。在做出某些决定之前,我需要检查所有的名字(而不是一个一个地做决定)

然后我尝试使用 mv 命令移动完成的数据文件(没有用,因为 for 语句中的“名称”存储了所有文件名,因此无论当前文件夹中有什么,它都在列表中)。我记得读过一些关于 shell 脚本如何不“实时”做事的文章,所以这行不通是有道理的。

我的想法是寻找对 if 语句的某种修改,以便它在我做出决定之前进行所有名称检查(如何?)

还有其他我可能会遗漏但可以尝试的命令吗?

最佳答案

我经常使用的一种模式是使用拆分命令。

ls <file_directory> > file_list
split -d -l 10 file_list file_list_part

这将创建文件,例如 file_list_part00 到 file_list_partnn 然后,您可以将这些文件名提供给您的脚本。

for file_part in `ls file_list_part*`
do
   for file_name in `cat file_part | tr '\n' ' '`
   do
     data_analysis_command file_name
   done
done

关于linux - 如何同时运行两个 bash 脚本而不重复相同的操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38820058/

相关文章:

bash - 在 BASH 脚本中使用字符串作为变量名

linux - 查找文件类型的shell脚本

xcode - MacOS 上的 pyenv zlib 错误 :

macos - 在默认情况下将Safari的Webinspector嵌入到Browserwindow中

python - vscode python linux : changes in debug console doesn't appear in 'variables->locals' debug pane

linux - Camel 2.15.2/netty3 : "java.net.SocketException: Invalid argument" from DatagramChannelImpl. send0()

linux - 如何列出Linux所有子目录中的最后10个文件

Bash:如何获得符号链接(symbolic link)的真实路径?

windows - 从 Mac 提交到 Windows 上的存储库时,获取 "can' t 获取文件上的独占锁定

python - 构建 docker 镜像时出现错误消息 "Error processing tar file(exit status 1)"