我有一系列檔案夾(A1、A2、...)和一些子檔案夾,但我只需要檢查遵循此模式的子檔案夾,0$n_st*不需要檢查其余的子檔案夾:
A1/
01_stjhs_lkk/
02_stlkd_ooe/
03_stoie_akwe/
...
A2/
01_stpw_awq/
02_stoe_iwoq/
03_stak_weri/
...
...
我想找到編號最大的子檔案夾(0$n)(子檔案夾的數量因檔案夾而異),然后轉到子檔案夾和grep其他檔案夾(A1,A2,...)上重復該程序這是我的腳本哪個不起作用(似乎if條件有問題)
for dd in */; do
cd "$dd" # A1, A2,...
for num in {8,7,6,5,4,3,2,1}; do
if [ -d 0${num}_st* ]; then
echo "0${num}_st*"
cd "0${num}_st*"
echo $(grep -i 'xyz f' 04_*.log) #grep this line from log file
break
fi
cd ..
done
cd ..
done
uj5u.com熱心網友回復:
直接的問題是,如果是匹配多個檔案的通配符,if [ -d ... ]則會產生語法錯誤。...您可以通過各種方式解決此問題,但可能與您的(模糊)要求相匹配的最簡單的方式類似于
for dd in */; do
for dir in "$dd"/0[0-9]_st*/; do
: nothing
done
# the variable `$dir` will now contain the alphabetically last match
grep -i 'xyz f' "$dir"/04_*.log
done
如果目錄在其名稱中包含不同數量的數字,則按字母順序對它們進行排序將不起作用(2 將在 19 之后)但您的示例在所有情況下都僅顯示具有兩位數字的名稱,因此讓我們假設這是有代表性的。
演示:https ://ideone.com/1N2Iui
這是一個變體,它展示了一種通過 using 找到最大數字的不同方法sort -n,因此它也適用于具有可變位數的目錄。
for dd in */; do
biggest=$(printf '%s\n' "$dd"/0*_st*/ | sort -d / -k2,2n | tail -n 1)
grep -i 'xyz f' "$biggest"/04_*.log
done
因為通配符已經以 結尾/,所以/后面的 eg"$dd"/嚴格來說是多余的,但無害。如果它打擾您(或者您在一個奇怪的系統上,雙斜杠對檔案系統具有特殊含義),您可以將其取出(以犧牲一些易讀性為代價)。
uj5u.com熱心網友回復:
建議find指揮。
find . -type d -printf "%f\n" |grep "^0"|sort -n|tail -n1
注意這個 find 命令遞回地掃描當前目錄下的所有目錄。
為了將find命令限制為特定目錄dir1 dir2,您需要在-type選項之前指定它們。
find dir1 dir2 -type d -printf "%f\n" |grep "^0"|sort -n|tail -n1
解釋
find . -type d
列印當前目錄下的所有目錄和子目錄find . -type d -printf "%f\n"
僅列印目錄名稱,不列印目錄路徑。grep "^0"
僅過濾以開頭的目錄名稱0如果匹配的目錄多于所需目錄,則可能還要細化
grepfiltergrep "^0[[:digit:]]\ _":。sort -n
按數字對目錄名稱進行排序tail -n1
列印最后一個目錄
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/451506.html
