在 shell 腳本 (sh) 中,我想找到一個可執行檔案,將其運行輸出保留在一個變數中,并將其路徑保留在另一個變數中。
假設我想查找所有已安裝的 OpenCV 版本,然后將主版本保留在一個變數中,并將檔案的位置保留在另一個變數中。
list=$(find / -type f -name opencv_version -exec {} \; 2>/dev/null | sort -u | cut -c-1); printf "%c;" $list
將回傳說 3;4; 但我也opencv_version分別想要版本 3 和 4 的檔案位置。為此,我需要find / -type f -name opencv_version在運行之前將第一部分的輸出存盤在另一個變數中-exec {} \;
我可以在一個班輪中完成這兩個操作嗎?
uj5u.com熱心網友回復:
使用-print and -exec,并將輸出處理放入 shell
例如,在我的 Mac 上,通過自制軟體安裝了 GNU awk:
find -L /usr -name awk -type f -executable \
-print \
-exec sh -c '"$1" --version | head -n 1' sh {} \; 2>/dev/null
輸出
/usr/bin/awk
awk version 20200816
/usr/local/bin/awk
GNU Awk 5.1.1, API: 3.1 (GNU MPFR 4.1.0, GNU MP 6.2.1)
/usr/local/var/homebrew/linked/gawk/bin/awk
GNU Awk 5.1.1, API: 3.1 (GNU MPFR 4.1.0, GNU MP 6.2.1)
/usr/local/var/homebrew/linked/gawk/libexec/gnubin/awk
GNU Awk 5.1.1, API: 3.1 (GNU MPFR 4.1.0, GNU MP 6.2.1)
/usr/local/opt/gawk/bin/awk
GNU Awk 5.1.1, API: 3.1 (GNU MPFR 4.1.0, GNU MP 6.2.1)
/usr/local/opt/gawk/libexec/gnubin/awk
GNU Awk 5.1.1, API: 3.1 (GNU MPFR 4.1.0, GNU MP 6.2.1)
/usr/local/Cellar/gawk/5.1.1/bin/awk
GNU Awk 5.1.1, API: 3.1 (GNU MPFR 4.1.0, GNU MP 6.2.1)
/usr/local/Cellar/gawk/5.1.1/libexec/gnubin/awk
GNU Awk 5.1.1, API: 3.1 (GNU MPFR 4.1.0, GNU MP 6.2.1)
這些線可以成對處理。
uj5u.com熱心網友回復:
建議將已排序檔案串列讀取到陣列中。
然后列印每個陣列元素,然后列印其執行結果:
readarray -t fileNamesArr < <(find / -type f -name opencv_version -executable 2>/dev/null | sort -u)
for aFileName in ${fileNamesArr[@]}; do printf "%s; %c\n" $aFileName $(aFileName); done
附加建議,locate如果可能,請使用命令。它更快更簡單。如果您經常使用updatedb.
測驗此解決方案
讀取機器中所有服務檔案的排序串列。比為每個 serviceFile 列印它的路徑和它的字符數。
readarray -t servicesArr < <(locate "*.service"|sort -u)
for serviceFile in ${servicesArr[@]}; do
printf "%s; %s\n" "$serviceFile" $(cat "$serviceFile"| wc -m );
done
與 相同的解決方案awk。
將排序的檔案名串列讀入 awk 腳本:
從當前檔案名準備一個printf命令。并運行它。
awk '{
bash_script = "printf \"%s; %c\\n\" "$0" $("$0")";
system("bash -c '\''" bash_script "'\''");
}' <<< $(find / -type f -name opencv_version -executable 2>/dev/null | sort -u)
uj5u.com熱心網友回復:
-exec我想我畢竟不需要。這對我有用:
for i in $(find / -type f -name opencv_version 2>/dev/null); do printf '%c in %s\n' $($i) $i; done
這將回傳如下內容:
4 in /usr/bin/opencv_version
3 in /home/user/opencv/build/bin/opencv_version
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/439536.html
上一篇:Linux設定變數
