所以我正在尝试编写一个程序来计算主目录中的文件,目录和可执行文件。由于某种原因,它没有为有多少文件,目录或可执行文件读取正确的数字。 当我在命令行中时,它会读取
ls ~/* | ls -f | wc -l = 31
ls ~/* | ls -d | wc -l = 1
ls ~/* | ls -x | wc -l = 5
这是我的代码和输出
files=0
directories=0
executables=0
for i in ~/*;do
if [[ -f "$i" ]];then
files=$(($files + 1))
elif [[ -d "$i" ]];then
directories=$(($directories + 1))
elif [[ -x "$i" ]];then
executables=$(($executables + 1))
fi
done
echo Files $files, Directories $directories, Executables $executables
输出是文件14,目录2,可执行文件0
为什么会发生这种事?
答案 0 :(得分:2)
ls -f
:将列出而不进行排序。这意味着-a
。因此,您将获得所有内容,包括.
和..
,文件或目录。它根本不像测试[[ -f $file ]]
。这就是为什么ls -f | wc -l
的答案31比你的剧本中的14要大得多。ls -d
:将列出目录而不是内容。没有任何参数,这在逻辑上是1,对应于.
(它没有列出.
的内容)。这就是你获得1的原因。ls -x
:按行而不是列列出条目...所以这不会计算任何相关的内容。你的脚本几乎没问题......除了你的if/elif
语句之外,最后的测试几乎永远不会被检查:可执行文件和目录之前将是if
之前的!
你很可能想要:
#!/bin/bash
files=0
directories=0
executables=0
for i in ~/*;do
if [[ -f $i ]];then
((++files))
if [[ -x $i ]]; then
((++executables))
fi
elif [[ -d $i ]];then
((++directories ))
fi
done
printf 'Files: %s, among which %d are executable\n' "$file" "$executables"
printf 'Directories: %s\n' "$directories\n'
答案 1 :(得分:1)
您需要首先检查目录,然后检查可执行文件,因为可执行文件也是文件因此您的脚本永远不会达到此条件:
elif [[ -x "$i" ]];then
以下是您的脚本的更正版本:
for i in ~/*; do
if [[ -d "$i" ]];then
((directories++))
elif [[ -x "$i" ]];then
((executables++))
elif [[ -f "$i" ]];then
((files++))
fi
done
echo "Files: $files, Directories: $directories, Executables: $executables"
答案 2 :(得分:0)
我会使用find
并将结果传递给awk
:
find "$HOME" -mindepth 1 -maxdepth 1 -printf "%Y %M\n" \
| awk '/f/{f++}/^f.*x/{x++}/d/{d++}END{printf "Files: %s Directories: %s Executables: %s\n",f,d,x}'