依次更改目录并运行脚本

依次更改目录并运行脚本

就我而言,我根本找不到任何帮助。我有 2000 个目录,我需要在其中运行特定程序。由于程序限制,它不能简单地写入“Output1”、“Output2”、“Output3”等。它必须将“Output”写入其输出文件,并将覆盖任何其他名为“Output”的文件,因此需要为程序的每个唯一实例创建一个目录。我需要的是类似这样的内容

其中 s 是目录的前缀。例如,s0001、s0002....s2000 是目录名称。

cd s(n)
ls
cd s(n+1)

并让这个循环命令在

cd s2000

。我试图通过

if 'cd s(n+1)' = 'cd s(2001)' then echo DONE

字符串,但无济于事。

任何帮助都将受到赞赏。

答案1

细节取决于您的设置。如果父目录仅包含子目录 s0001 至 s2000,则您只需遍历它们并在每个子目录中启动程序:

for d in s*; do
  cd "$dir" && run_program; cd ../;
done

它将进入每个目录并启动run_program。一旦完成,它将返回。

如果您需要指定一系列目录,请使用以下命令:

for dir in s{0001..2000}; do
    cd "$dir" && run_program; cd ../
done

最后,如果您想同时启动所有进程(这可能会导致您的计算机崩溃),请使用&

for dir in s{0001..2000}; do
    cd "$dir" && run_program & cd ../
done

旧版本的 bash 不会扩展{001..002}as,001 002而是使用 as 1 2。如果您的 bash 不支持此功能,请使用此方法:

seq 1 2000 | while read i; do 
   dir=$(printf '%0.4d\n' "$i")
   cd s"$dir" && run_program; cd ../;
done

诀窍是使用生成 1 到 2000 之间的数字seq,然后printf根据需要添加前导 0。

答案2

这是一个 bash 脚本。您可以随意调整它以满足您的需要。

#!/bin/bash
#set -x
BASEDIR=/home/xieerqi

find "$BASEDIR" -type d -name "s[[:digit:]][[:digit:]][[:digit:]][[:digit:]]" -print0 | while IFS= read -r -d '' folder; do
        echo "$folder"
        cd "$folder"
        echo "TEST" | tee filez{1,2,3}
done

答案3

你可以尝试这个python脚本

import os
def main():
    a = 100
    while a>1:
        os.chdir(os.path.expanduser("~/s000"+a))
        do your work here
        a = a-1
if __name__ == "__main__":
    main()

其中 while 循环改变目录直到它等于 1。您可以根据自己的意愿更改 a 的值,并在“在这里做您的工作”处写下您想要做的事情。

答案4

程序总是会写Output,但您不必保留它。如果程序的设置是从命令行控制的,您可以简单地运行程序并在完成后立即重命名输出:

for dirname in `ls -d s*`
do
    myprogram "$dirname"
    mv Output Output-"$dirname"
done

当然,我不知道你的程序接受什么参数,因为你没有说。如果它实际上从大量文件中读取,那么拥有单独的目录仍然是有意义的。但“输出名称是固定的”本身并不是这么麻烦的理由。

PS:不要在文件名中使用括号。它们对 shell 来说有特殊含义,除非您知道如何处理它们,否则它们会使您的脚本混乱。

相关内容