我在一个文件夹(Data)中有子文件夹(data1、data2、data3),python(.py)程序存在于所有同名子文件夹中。我想在每个文件夹中运行这些python程序。
Data
data1/a.py
data1/b.py
data1/c.py
data2/a.py
data2/b.py
data2/c.py
data3/a.py
data3/b.py
data3/c.py
我尝试了以下代码:
for dir in Data/*
do
cd $dir
python *.py
done
但它不会执行子文件夹中的代码,有人能为它提出一个合适的解决方案吗。
不要用循环来执行此操作。假设您希望在Data/
及其以下运行所有python脚本,并且希望这些脚本在当前工作目录下执行,该目录等于找到脚本的目录,请使用:
find Data -name '*.py' -execdir ./{} ;
如果您不想执行所有脚本,请适当地筛选find
。
例如,如果您只想运行名为a.py
、b.py
或c.py
的脚本,可以使用:
find Data -name '[abc].py' -execdir ./{} ;
如果您的目录命名不正确,您可能还希望使用-type f
来避免尝试执行名为a.py
的目录。例如find Data -type f -name '[abc].py' -execdir ./{} ;
您可以通过指定目录来简单地限制作用域:find Data/data1 Data/data3 ...
或find Data/data[12] ...
或find Data/data[13] ...
所有工作都符合预期。
我不认为您可以用一个命令运行多个Python脚本。但是您可以使用第二个for
循环来实现这一点。
另一个问题是,在下一个循环迭代开始之前,您需要将cd
备份到父目录;CCD_ 14和CCD_。
for dir in Data/*
do
pushd $dir
for script in *.py
do
python $script
done
popd
done
我不使用python
,所以fwiw。。。
假设:
python
可以使用作为输入一部分的目录/路径- 我们位于
Data
的父目录中 - 我们希望执行位于
Data
下的所有*.py
脚本
简化操作的一个想法:
while read -r script
do
python "${script}"
done < <(find Data -type f -name "*.py")
或者,将我们自己限制在特定的子目录中:
for script in Data/data{1..3}/*.py
do
python "${script}"
done
另一种方法是子shell。
您正在cd
进入第一个目录,然后可能在下一个目录中出错,因为它不存在,即,cd data1/
的第一次迭代和其他迭代都不是它的子目录。
假设您的结构处于/tmp/
之下。您已登录到/tmp/Data
并运行您的脚本。第一个循环执行cd data1/
,因此您现在已登录到/tmp/Data/data1/
。让我们暂时跳过执行。。。
下一次迭代发布cd data2/
,它不作为/tmp/Data/data1
的子目录存在,因此它失败了,此时您应该希望python *.py
会失败,或者至少是无害的幂等的。。。
所以,让我们尝试一个简单的解决方案。假设您已登录到存在Data
子目录的目录,
for this in Data/*/*.py; do # iterate over the *scripts*
( cd "${this%/*}/" && python "$this" )
done
当子shell退出时,父级仍然记录到Data
所在的目录。只有子shell执行了cd
。
或者,如果脚本不要求您登录到该目录,
for this in Data/*/*.py; do python "$this"; done
这对你有用吗?