我在檔案夾(資料)中有子檔案夾(資料1,資料2,資料3),并且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
但它不執行子檔案夾內的代碼,任何人都可以提出適當的解決方案。
uj5u.com熱心網友回復:
我不認為你可以用一個命令運行多個 Python 腳本。但是您可以使用第二個for回圈來實作這一點。
另一個問題是需要cd在下一次回圈迭代開始前備份到父目錄;pushd并且popd是一個很好的解決方案。
for dir in Data/*
do
pushd $dir
for script in *.py
do
python $script
done
popd
done
uj5u.com熱心網友回復:
我不使用python所以fwiw ...
假設:
python可以使用目錄/路徑作為輸入的一部分- 我們坐在父目錄中
Data - 我們要執行
*.py位于(某處)下的所有腳本Data
一種簡化操作的想法:
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
uj5u.com熱心網友回復:
不要用回圈來做這件事。假設您想在 中及以下運行所有python 腳本Data/,并且您希望在當前作業目錄與腳本所在目錄相同的情況下執行這些腳本,請使用:
find Data -name '*.py' -execdir ./{} \;
如果您不想執行所有腳本,請find適當過濾。
例如,如果您只想運行腳本 name a.py, b.py, or 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] ...預期的所有作業。
uj5u.com熱心網友回復:
另一種方法是子殼。
您正在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 退出時,父級仍會登錄到Datais所在的目錄。只有子外殼做了cd.
或者,如果腳本不需要您登錄到該目錄,
for this in Data/*/*.py; do python "$this"; done
這對你有用嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/314442.html
