使用shell脚本计算主目录中的文件,目录和可执行文件的数量

时间:2015-02-25 21:06:46

标签: bash shell

所以我正在尝试编写一个程序来计算主目录中的文件,目录和可执行文件。由于某种原因,它没有为有多少文件,目录或可执行文件读取正确的数字。 当我在命令行中时,它会读取

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

为什么会发生这种事?

3 个答案:

答案 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}'