编写bash文件以在目录中为所有文件夹运行Python程序

0 投票
2 回答
929 浏览
提问于 2025-04-19 12:14

我现在写了一个程序,可以计算一组数据的标准差。我有超过200个文件夹,每个文件夹里都有自己的一组数据。我想写一个bash文件,让这个程序能对所有文件夹执行计算,并把所有的标准差结果输出到一个主文件里,就像在python中规定的那样。

到目前为止,我写了:

#!/bin/bash

for D in SAND; do python sample.py
  [ -d "$D" -a -x "$D/all" ] && "$D/all"
done

注意:SAND是我的目录。

但是这个方法不行。请帮帮我。

另外,当我尝试其他例子并运行时,总是出现错误:

Traceback (most recent call last):
  File "sample.py", line 1, in <module>
    f=open("default")
IOError: [Errno 2] No such file or directory: 'default'

尽管我在文件夹里确实有名为“default”的数据文件。

2 个回答

1

另外,你也可以完全不使用bash,直接修改你的Python脚本。os.walk()这个函数可以让你依次访问每一个文件夹:

import os,sys

for arg in sys.argv[1:] or ['.']:
  for dirpath, _, filenames in os.walk(arg):
    for filename in filenames:
      if filename == 'all':
        all_file = os.path.join(dirpath, filename)
        default_file = os.path.join(dirpath, 'default')
        # ... whatever you do with SAND/foo/all
        # foo = open(all_file)
        # std_dev = bar(foo)
        # ... I'll just print them
        print all_file, default_file
2

下面的内容假设 SAND 是你目录的真实名称。

第一种选择:使用循环。

for d in SAND/*/all; do
  python sample.py "$d"
done

...或者,如果你需要切换到找到的目录...

orig_dir=$PWD
for d in SAND/*/all; do
  (cd "$d/.." && exec python "$orig_dir/sample.py" all)
done

第二种选择:使用 find 命令。

我建议直接搜索名为 all 的目标:

find SAND -name all -exec python sample.py '{}' '+'

另外,使用 POSIX 的 find 命令,你可以让 find 调用一个 shell 来执行更多的逻辑:

find SAND -type d -exec bash -c \
  'for d; do [[ -d "$d/all" ]] && python sample.py "$d/all"; done' _ '{}' +

如果 SAND 是一个变量名,而不是一个真实的目录名,那么在上面的内容中把 SAND 改成 "$SAND",记得加上引号(而且,最好把它改成小写——按照惯例,只有环境变量和 shell 内置变量应该用全大写,以避免命名冲突)。

撰写回答