linux_ls
Linux 文件列表 美化工具
一键脚本
bash <(curl -sL gitee.com/meimolihan/linux-command_sh/raw/master/linux_ls.sh) /var/lib/vz/dump
| 功能模式 | 执行命令 | 作用说明 |
|---|---|---|
| 默认查看当前目录 | ./list-dir.sh |
彩色美化展示当前目录文件(按时间排序) |
| 指定目录查看 | ./list-dir.sh /data/www |
美化展示指定目录文件列表 |
| 实用示例 | ./list-dir.sh /root |
查看 /root 目录美化版文件清单 |
| 展示效果 | - | 彩色权限、大小、用户、时间、文件名,清晰易读 |
| 排序规则 | - | 按修改时间倒序展示,最新文件排在最前 |
效果预览
补充说明
该脚本用于美化显示目录文件列表,基于 stat、find、du 命令实现,适合需要替代原生 ls 命令、追求更清晰输出格式的场景。
功能特点
- 按时间排序:文件按修改时间倒序排列,最新的文件在最上方
- 彩色输出:权限(灰色)、链接数(黄色)、所有者(蓝色)、组(绿色)、大小(黄色)、时间(青色)、文件名(紫色),一目了然
- 人类可读大小:自动将文件大小转换为 B、K、M、G 单位
- 目录总大小:顶部显示目录总计占用空间
- 支持参数:可指定任意目标目录(默认当前目录)
- 纯 stat 实现:不使用
ls命令,避免解析ls输出的兼容性问题
输出说明
脚本输出包含以下字段:
| 字段 | 说明 |
|---|---|
| 路径 | 显示当前查看的目录路径 |
| 总计 | 目录占用的总磁盘空间 |
| 权限 | 文件权限,如 -rw-r--r-- |
| 链接 | 硬链接数量 |
| 所有者 | 文件所属用户 |
| 组 | 文件所属组 |
| 大小 | 文件大小(自动适配单位) |
| 修改时间 | 文件最后修改时间,格式 YYYY-MM-DD HH:MM:SS |
| 文件名 | 文件名(紫色高亮) |
参数示例
# 查看当前目录
bash linux_ls.sh
# 查看指定目录
bash linux_ls.sh /var/log
bash linux_ls.sh /etc
注意事项
- 脚本依赖
stat、find、du命令,所有 Linux 发行版均内置 - 仅显示当前目录下的文件(不包含子目录),如需包含目录可修改
-type f为-type f -o -type d - 排序基于
find -printf '%T@',需要 GNU findutils(Linux 标准组件)
脚本源码
#!/bin/bash
set -uo pipefail
gl_hui=$'\033[38;5;59m'
gl_huang=$'\033[38;5;11m'
gl_hong=$'\033[38;5;9m'
gl_lan=$'\033[38;5;32m'
gl_lv=$'\033[38;5;10m'
gl_qing=$'\033[38;5;14m'
gl_zi=$'\033[38;5;13m'
gl_bai=$'\033[38;5;15m'
gl_bufan=$'\033[38;5;14m'
reset=$'\033[0m'
break_end() {
echo -e "${gl_bufan}————————————————————————————————————————————————${reset}"
echo -e "${gl_lv}操作完成${reset}"
echo -e "${gl_bai}按任意键继续 ${gl_hong}.${gl_huang}.${gl_lv}.${reset}\c"
read -r -n 1 -s
echo ""
clear
}
list_beautify_directory() {
local target_dir="${1:-.}"
[[ -d "$target_dir" ]] || {
echo -e "${gl_hong}错误:目录不存在 → $target_dir${reset}"
return 1
}
clear
echo -e "${gl_zi}>>> 目录文件列表(按时间排序)${reset}"
echo -e "${gl_bufan}————————————————————————————————————————————————${reset}"
echo -e "${gl_lan}路径:${gl_huang}${target_dir}${reset}"
echo -e "${gl_bufan}————————————————————————————————————————————————${reset}"
# 总大小
du -sh "$target_dir" 2>/dev/null | awk -v qing="$gl_qing" -v rst="$reset" \
'{print qing "总计 " $1 rst}'
# 核心:不用 ls,直接用 stat
find "$target_dir" -maxdepth 1 -type f -printf '%T@ %p\0' |
sort -zn |
while IFS= read -r -d '' line; do
mtime="${line%% *}"
file="${line#* }"
stat --format="%A %h %U %G %s" "$file" | awk \
-v hui="$gl_hui" \
-v huang="$gl_huang" \
-v lan="$gl_lan" \
-v lv="$gl_lv" \
-v qing="$gl_qing" \
-v zi="$gl_zi" \
-v rst="$reset" \
-v mtime="$mtime" \
-v fname="$(basename "$file")" '
{
size=$5
if (size >= 1073741824)
size=sprintf("%.1fG", size/1073741824)
else if (size >= 1048576)
size=sprintf("%.1fM", size/1048576)
else if (size >= 1024)
size=sprintf("%.1fK", size/1024)
else
size=size "B"
cmd="date -d @" mtime " \"+%F %T\""
cmd | getline ctime
close(cmd)
printf "%s%-12s%s %s%4s%s %s%-8s%s %s%-8s%s %s%6s%s %s%-19s%s %s%s%s\n",
hui, $1, rst,
huang, $2, rst,
lan, $3, rst,
lv, $4, rst,
huang, size, rst,
qing, ctime, rst,
zi, fname, rst
}'
done
}
main() {
list_beautify_directory "${1:-.}"
break_end
}
main "$@"
创建本地脚本
new_script="new_test.sh"
cat > "$new_script" << 'EOF'
#!/bin/bash
# 粘贴脚本源码
EOF
chmod +x "$new_script" && ./"$new_script" && rm -f "$new_script"