![如何將文件資訊儲存到數組中?](https://rvso.com/image/1087142/%E5%A6%82%E4%BD%95%E5%B0%87%E6%96%87%E4%BB%B6%E8%B3%87%E8%A8%8A%E5%84%B2%E5%AD%98%E5%88%B0%E6%95%B8%E7%B5%84%E4%B8%AD%EF%BC%9F.png)
透過這部分腳本,我可以獲得有關目錄(和子目錄)中文件的必要資訊。我需要的唯一資訊是檔案的副檔名和大小。
for file in `find . -type f`; do
size=$(stat -c '%s' ${file})
file=$(echo "${file}" | awk -F/ '{print $NF}')
ext=$(echo "${file}" | grep '..*\.' | awk -F. '{print $NF}' | grep '[A-Za-z0-9]')
if [ -z ${ext} ]; then
echo "NOTE: no extention"
else
EXTS="${EXTS}${ext}${newLine}"
這只是腳本的一部分。所以我的問題是:如何將這些資訊放入陣列中?我的意思是我想要一個包含以下元素的陣列:
c/123 /12 h/90 /0 txt/0
其中 c、h 和 txt 是檔案副檔名,123、12 和 0 是檔案大小。所以最近我
希望可以單獨處理尺寸和擴展,我已經整齊地放下了我的問題。抱歉有錯誤。 :)
答案1
第一的,不做for file in $(find …)
。那是非常脆弱的。
現在,您可以使用 find 來一起列印檔案名稱和大小,從而簡化程式碼-printf
:
find . -type f -printf '%s.%f/'
然後,您可以用來awk
處理此輸出以透過擴展來獲取累積大小。請注意,我曾經.
將文件名 ( %f
) 與大小 ( ) 分開,並在後面%s
添加了。/
因此,我可以.
在awk
.由於檔案名稱中唯一不允許的字元是/
ASCII NUL,因此我可以安全地用作/
記錄分隔符號。
所以:
awk -F. -v RS=/ 'NF > 2 {size[$NF] += $1; next}
{size["/"] += $1}
END {for (i in size) {print i,"/",size[i]}'
/
在這裡,如果沒有擴展名,我將用作索引。
綜合:
$ find . -type f -printf '%s.%f/' | awk -F. -v RS=/ 'NF > 2 {size[$NF] += $1; next}
{size["/"] += $1}
END {for (i in size) {printf "%s/%d\n", i, size[i]}}'
h/780
md/2509
tex/23961
c/13557
//5109
txt/2349291
sh/1166
py/12248
現在,如果您的副檔名不包含空格,您可以這樣做:
my_array=( $(find . -type f -printf '%s.%f/' | awk -F. -v RS=/ 'NF > 2 {size[$NF] += $1; next} {size["/"] += $1} END {for (i in size) {printf "%s/%d\n", i, size[i]}}') )
或者,您可以使用進程替換並閱讀以下位置中的每個條目:
my_arr=()
while IFS='' read -r entry
do
my_arr+=( "$entry" )
done < <(find . -type f -printf '%s.%f/' | awk -F. -v RS=/ 'NF > 2 {size[$NF] += $1; next} {size["/"] += $1} END {for (i in size) {printf "%s/%d\n", i, size[i]}}')
像之前一樣:
$ printf "%s\n" "${my_arr[@]}"
h/780
md/2509
tex/23961
c/13557
//5109
txt/2349291
sh/1166
py/12248
答案2
這是一個簡短的 bash 腳本,它的作用是:
i=0
while read -r -d $'\0' file
do
size=$(stat -c '%s' ${file})
ext=`basename $file | sed -re "s/^[^.]+.*\.//"`
if [ -z "$ext" ] || [ "$ext" = "`basename $file`" ] ; then
echo "NOTE: no extention ($file)"
else
extensions[$i]="$ext"
sizes[$((i++))]=$size
fi
done < <(find . -type f -print0)
for (( j=0 ; j<i; j++ )) do
echo index: $j / extension: ${extensions[$j]} / size: ${sizes[$j]}
done