Linux
在shell腳本中比較兩個數組及其各自的目錄?
我在 shell 腳本中有主文件數組和輔助文件數組。這兩個數組都將包含文件編號。
#!/bin/bash pri=(958 955 675 703 936 933 930 927 908 905 902 899 709) snd=(953 947 943 939 916 915 1023 889 1010 1054 977 970 966) # directories where we need to compare primary=/primaries secondary=/secondaries echo "primary files: ${pri[@]}" echo "secondary files: ${snd[@]}" # now compare files in primary array `pri[@]` with `/primaries` directory. All files in primary array should be present in `/primaries` directory. # and compare secondary array `snd[@]` with `/secondaries` directory. All files in secondary array should be present in `/secondaries` directory. # If any of the file is missing, log a message.
現在主陣列中的所有文件
pri[@]
都應該存在於/primaries
目錄中,並且輔助陣列中的所有文件snd[@]
都應該存在於/secondaries
目錄中。兩個目錄中的文件名都是這樣的proc_1041_test.data
。這裡 1041 是文件號。如何將主數組文件編號與主目錄中的文件進行比較,以及對輔助文件進行類似的比較?
注意:
/primaries
目錄中/secondaries
可以有子目錄,所以我只需要在這兩個父目錄中查找文件,而不是在任何子目錄中。
對於其中一個數組:
for num in "${pri[@]}"; do name="proc_${num}_test.data" if [ ! -f "$primary/$name" ]; then printf '"%s" not found in "%s"\n' "$name" "$primary" >&2 fi done
也就是說,遍歷數組中的數字,構造預期的文件名並測試目錄中是否存在預期的文件名。如果不是,則將診斷消息寫入標準錯誤流。
一次性完成兩組文件:
set -- "$primary" "$secondary" typeset -n array for array in pri snd; do for num in "${array[@]}"; do name="proc_${num}_test.data" if [ ! -f "$1/$name" ]; then printf '"%s" not found in "%s"\n' "$name" "$1" >&2 fi done shift done
這引入了一個名稱引用變數
array
。訪問${array[@]}
時,名稱已分配給的變數array
(在循環中,首先是pri
然後snd
)將被訪問。目錄名稱
$primary
和$secondary
分配給位置參數$1
,$2
在循環之前使用set
,當我們完成shift
$2
原始.$1``$1
¹ 並且是正常文件(或可訪問正常文件的符號連結),更改
[ ! -e "$primary/$name" ] && [ ! -L "$primary/$name" ]
為檢查文件是否存在,無論其類型如何。