【问题标题】:Run a qsub command in all subdirectories在所有子目录中运行 qsub 命令
【发布时间】:2018-02-02 13:27:40
【问题描述】:

我在 HPC 上使用 Centos 来运行我的代码。我通常有一个文件夹,其中包含一个 run_calc 文件,这是我想要运行的:

qsub run_calc

现在我想编写一个脚本“submit_all.sh”,它提交当前目录中所有子文件夹中的所有 run_calc 文件,而不是来自我运行 submit_all.sh 脚本的父文件夹。

我在Solution 和Solution2 发现了类似的问题 这似乎是这个问题的部分答案。在找到解决方案之前,我对提交脚本没有信心,这就是我问的原因:

在第二个链接中我找到了这个解决方案:

for i in {1..1000}; do
    cd "$i"
    qsub submit.sh
    cd ..
done

“i”是名称为 1-100 的文件夹列表。是否可以使用 find 创建所有子目录的列表并将其路径到 for 循环?我将如何处理子子目录?我是否可以更改 cd .. 语句,以便在这种情况下我总是直接返回父文件夹?

我喜欢这个解决方案:Solution

#!/bin/sh

for i in `find /var/www -type d -maxdepth 1 -mindepth 1`; do
   cd $i
   # do something here
done

但我不明白这是怎么回事?是否可以将上述脚本更改为只潜入包含 run_calc 文件并包含子子目录的文件夹?

提前谢谢你

【问题讨论】:

标签: linux grep find qsub


【解决方案1】:

假设您使用bash 作为您的外壳:

$ cat ./test.sh
#!/bin/bash

IFS=$'\n' 
while read -r fname ; 
do 
    pushd $(dirname "${fname}") > /dev/null
    qsub run_calc 
    popd > /dev/null 
done < <(find . -type f -name 'run_calc')

find . -type f -name 'run_calc' 在当前目录及其子目录中查找文件run_calc 的所有路径。这是while loop 的输入。

pushd, popd 是 bash 特定的,并添加或弹出目录堆栈。

【讨论】:

  • 当我提交这个脚本时,我得到“qsuball.sh: line 1: $: command not found”。如果我删除第一行脚本被执行,但似乎没有结果。我做错了吗?
  • 脚本的第 1 行有什么内容?脚本的内容不包括这一行:$ cat ./test.sh。我希望你不包括在内。
  • 我删除了 cat ./test.sh 部分,但不知何故留下了 $... 不幸的是,如果我从 #!/bin/bash 开始,它仍然不起作用。如果我看一下,至少队列中没有新工作?顺便说一句,感谢您抽出宝贵时间!
  • 检查此命令是否为您的 run_calc 文件提供了正确的路径:find /var/www -type f -name 'run_calc'。如果是,则转到其中一个目录并执行 qsub run_calc 并查看它是否真的有效。
  • 如果我运行:find /var/www -type f -name 'run_calc' 没有错误,但是什么也没找到。如果有意义的话,我会得到一个新的空命令行。
【解决方案2】:
for d in `find . -type d`
do ( cd "$d"
     if test ! -f run_calc; then continue; fi
     qsub run_calc
) done

( commnds ) 在单独的进程中执行commands,cd 的效果不会“泄漏”。

【讨论】:

  • iamuser 的答案似乎有效。只是出于兴趣,这个解决方案有什么好处吗?谢谢你的回答!
  • 它不是 bash 特定的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
相关资源
最近更新 更多