我有一個存盤在文本檔案中的檔案串列,如果在該串列中找到了 Python 檔案。我想用pytest來對應的測驗檔案。
我的檔案看起來像這樣:
/folder1/file1.txt
/folder1/file2.jpg
/folder1/file3.md
/folder1/file4.py
/folder1/folder2/file5.py
當找到第 4 個/第 5 個檔案時,我想像這樣運行命令 pytest:
pytest /folder1/test_file4.py
pytest /folder1/folder2/test_file5.py
目前,我正在使用這個命令:
cat /workspace/filelist.txt | while read line; do if [[ $$line == *.py ]]; then exec "pytest test_$${line}"; fi; done;
這不能正常作業,因為我在文本中也有檔案路徑。知道如何實作這一點嗎?
uj5u.com熱心網友回復:
使用 Bash 的變數子字串洗掉來添加test_. 單線:
$ while read line; do if [[ $line == *.py ]]; then echo "pytest ${line%/*}/test_${line##*/}"; fi; done < file
更易讀的形式:
while read line
do
if [[ $line == *.py ]]
then
echo "pytest ${line%/*}/test_${line##*/}"
fi
done < file
輸出:
pytest /folder1/test_file4.py
pytest /folder1/folder2/test_file5.py
對Google Cloudbuild 一無所知,所以我會讓您嘗試使用雙美元符號。
更新:
如果檔案已經帶有test_前綴,請使用此 bash 腳本,該腳本在變數子字串洗掉中使用 extglob:
shopt -s extglob # notice
while read line
do
if [[ $line == *.py ]]
then
echo "pytest ${line%/*}/test_${line##*/?(test_)}" # notice
fi
done < file
uj5u.com熱心網友回復:
您可以輕松地將所有條件重構為一個簡單的sed腳本。這也擺脫了無用cat和同樣無用的exec。
sed -n 's%[^/]*\.py$%test_&%p' /workspace/filelist.txt |
xargs -n 1 pytest
正則運算式匹配最后一個斜杠后的任何內容,如果沒有斜杠,則表示整行;我們包含.py后綴以確保它只匹配那些檔案。
管道 toxargs是將標準輸入轉換為命令列引數的常用方法。該-n 1說在同一時間通過一個引數,而不是盡可能多的。(也許pytest允許您指定許多測驗;然后,您可以取出-n 1并讓xargs盡可能多地傳入。)
如果您想避免將test_前綴添加到已有的檔案中,一種解決方案是將sed腳本分解為兩個單獨的操作:
sed -n '/test_[^/]*\.py/p;t;s%[^/]*\.py$%test_&%p' /workspace/filelist.txt |
xargs -n 1 pytest
第一個p簡單地逐字列印匹配項;的t說,如果匹配,跳過腳本的其余部分此輸入。
(MacOS / BSDsed需要在t命令后使用換行符而不是分號。)
sed可以說是一種只讀語言;這已經迫在眉睫,也許你會用 Awk 重寫它。
uj5u.com熱心網友回復:
您可能希望關注以“.py”字串結尾的行您可以使用 grep 結合正則運算式來實作這一點,這樣您就可以確定一行是否以 .py 結尾 - 這消除了 if 陳述句。
IFS=$'\n'
for file in $(cat /workspace/filelist.txt|grep '\.py$');do pytest $file;done
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/383724.html
上一篇:用星號顯示用戶登錄的次數
