Linux

在shell腳本中比較兩個數組及其各自的目錄?

  • April 15, 2018

我在 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" ]為檢查文件是否存在,無論其類型如何。

引用自:https://unix.stackexchange.com/questions/437867