我有来自下面脚本的以下代码,该代码应该捕获ls -l
当前目录的输出并丢弃写入总计的第一行。然后将每个文件的权限、所有者和文件名以及最后的总行数输出到终端。问题是,如果目录中存在名称中包含空格的文件,则该文件未正确列出。为什么不?
list=`ls -l`
IFS_old=$IFS
IFS=$'\n'
i=0
for row in $list
do
if (( $i == 0 )); then
((i++))
else
IFS=$' '
j=0
for attrib in $row
do
((j+=1))
if (( $j == 1 )) || (( $j == 3 )) || (( $j == 5 )) || (( $j == 9 )); then
printf "%s " $attrib
fi
done
printf "\n"
IFS=$'\n'
((i++))
fi
done
printf "%s%s\n" "Total number of files : " $((i-1))
IFS=$IFS_old
exit 0
答案1
尝试解析 的输出ls
是不明智的,即使使用支持明确输出选项的实现(例如GNU 版本中的-b
或 )也是如此。-Q
相反,您应该使用 shell glob 一次处理一个文件;在 Bash 中,我们可以使用数组来实现:
#!/bin/bash
files=(*)
for i in "${files[@]}"
do
stat --format '%A %U %n' -- "$i"
done
printf "Total number of files: %d\n" ${#files[@]}