计算给定目录中的文件、目录等并在屏幕上格式化输出

计算给定目录中的文件、目录等并在屏幕上格式化输出

刚刚开始了脚本编写课程,需要一些帮助。我正在编写一个脚本来检查给定目录中每个文件和目录的文件名,并累积每个文件、子目录、符号链接、旧文件、图形文件、tmp 文件、exe 文件的计数以及每个文件的总字节数在该目录中。

输出需要按以下方式格式化:

  • 目录 n,nnn,nnn
  • 文件 n,nnn,nnn
  • ETC...

当我运行脚本时,它似乎没有计算任何内容,因为所有计数项都返回 0。我在将数字格式化为逗号时也遇到问题。 $1 是用户运行脚本时将输入的搜索目录,即:./srpt /etc。为了运行搜索,我使用 find 命令和 printf 来格式化输出,并将输出通过管道传输到 wc 以计算行数。我认为这会给我授予文件名只是一行的文件数。可能有十亿种方法可以做到这一点,这种方法可能不是最优雅的,但我会感谢任何人的意见。

if [ -d "$1" ]; then
        directories=$(find "$1" -type d -printf "%'d" | wc -l)
        files=$(find "$1" -type f -printf "%'d" | wc -l)
        sym=$(find "$1" -type l -printf "%'d" | wc -l)

ETC...

#Printing the output to the terminal
      echo "Directories" $directories
      echo "Files" $files
      echo "Sym links" $sym
      exit 0
else
        echo "[ERROR]: need path to perform search"
        exit 1
fi

我的输出:

Directories 0
Files 0
Sym Links 0

答案1

您需要将命令更改为以下形式:

directories=$(printf "%'d\n" $(find "$1" -type f | wc -l))

printf使用当前区域设置的千位分隔符,该分隔符可能是逗号、点或什么都没有。如果您想强制使用逗号,您可以更改区域设置。

另外,你还可以通过这样的方式来做:

if [ -d "$1" ]; then
    directories=$(find "$1" -type d | wc -l)
    files=$(find "$1" -type f | wc -l)
    sym=$(find "$1" -type l | wc -l)

并替换echoprintf

#Printing the output to the terminal

  printf "%s %'d\n" "Directories" $directories
  printf "%s %'d\n" "Files" $files
  printf "%s %'d\n" "Sym links" $sym

发生错误是因为您混淆了两个不同的命令 - bashprintf和 find -printf

对于查找的-printf格式"%'d"不正确。不允许使用单引号,单引号%d是文件在目录树中的深度。您可以通过键入:找到-printf中的所有选项。man find/printf format

顺便说一句,它需要添加\n到两者printf(bash 和 find):"%d\n",否则它们将在一行中打印所有输出。

答案2

-printf "%'d"那里什么也没做,所以计数结果为 0,你需要用它来改变它-printf "%p\n"

相关内容