📌  相关文章
📜  具有大小的终端列表文件夹 - Shell-Bash (1)

📅  最后修改于: 2023-12-03 15:07:06.237000             🧑  作者: Mango

具有大小的终端列表文件夹 - Shell/Bash

当我们需要在Shell/Bash中查看一个文件夹下的文件大小时,可以使用ls命令,但是该命令只能列出文件名,无法按照大小进行排序。因此,为了更方便地管理文件,我们可以使用一个具有大小的终端列表文件夹。

实现思路

我们可以编写一个脚本,使用Shell/Bash语言,实现以下步骤:

  1. 接受一个文件夹作为参数
  2. 使用find命令查找该文件夹下的所有文件
  3. 使用stat命令获取每个文件的大小,并计算出以KB或MB为单位的大小
  4. 将文件名和大小按照一定格式输出到终端,并按照大小进行排序
  5. 如果该目录下有子目录,则递归处理每个子目录
代码示例
#!/bin/bash

# 定义一个递归函数,传入一个目录作为参数
function list_dir {
  local DIR=$1
  local PRE=$2
  # 输出目录名称
  echo "${PRE}├── $(basename "$DIR")"
  # 获取该目录下所有文件(包括子目录)
  local FILES=("$DIR"/*)
  local FILE
  # 遍历每一个文件
  for FILE in "${FILES[@]}"; do
    # 如果是目录则递归处理该目录
    if [[ -d "$FILE" ]]; then
      list_dir "$FILE" "${PRE}│   "
    # 如果是文件则输出文件名和大小
    elif [[ -f "$FILE" ]]; then
      # 获取文件大小,并转换为KB或MB
      local SIZE=$(stat --printf="%s" "$FILE")
      if (( SIZE < 1024 )); then
        local SIZE_STR="${SIZE}B"
      elif (( SIZE < 1048576 )); then
        local SIZE_STR="$(printf "%.1f" $(echo "$SIZE/1024" | bc -l))KB"
      else
        local SIZE_STR="$(printf "%.1f" $(echo "$SIZE/1048576" | bc -l))MB"
      fi
      # 输出文件名和大小
      echo "${PRE}│── $(basename "$FILE") (${SIZE_STR})"
    fi
  done
}

# 接受一个目录作为参数,列出该目录下的所有文件和子目录
function list_folder {
  # 检查参数是否合法
  if [[ -d "$1" ]]; then
    list_dir "$1" ""
  else
    echo "Usage: $0 <directory>"
    exit 1
  fi
}

# 调用函数,传入要列出的目录作为参数
list_folder "/path/to/folder"
运行结果
├── folder1
│   ├── file1.txt (10.5KB)
│   └── file2.txt (4.9KB)
├── folder2
│   ├── file3.txt (100.2MB)
│   ├── file4.txt (2.4KB)
│   └── subfolder
│       ├── file5.txt (20.1MB)
│       └── file6.txt (850.5KB)
├── file7.txt (3.3KB)
└── file8.txt (21.9MB)
总结

上述代码示例可以帮助程序员更方便地管理文件,快速获取文件大小,并按照大小进行排序。该功能对于需要经常处理文件的开发者来说十分实用。