就我而言,我根本找不到任何帮助。我有 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 来说有特殊含义,除非您知道如何处理它们,否则它们会使您的脚本混乱。