stat -c "%n" 仅输出完整路径,需结合 basename 和 bash 参数扩展(如 ${f%.\*})才能安全提取纯文件名(不含路径和扩展名),推荐使用 basename "$(stat -c "%n" "$file_path")" | sed 's/\.[^.]*$//' 或直接参数扩展。

stat -c "%n" 本身不能直接获取“纯名称”(即不带路径和扩展名),它只输出文件的完整路径字符串(包括目录和文件名)。但你可以结合 stat 和其他命令(如 basename、dirname、sed 或 awk)来提取纯名称(base name without extension),用于自动化命名逻辑。
下面分步骤说明如何安全、可靠地实现这个目标:
1. 先用 stat -c "%n" 获取完整路径
例如:
stat -c "%n" /home/user/docs/report_v2.pdf
输出:
/home/user/docs/report_v2.pdf
2. 提取纯文件名(不含路径)→ 用 basename
对上面结果去路径,保留 `report_v2.pdf`:
stat -c "%n" /home/user/docs/report_v2.pdf | xargs basename
或更稳妥(避免空格问题):
basename "$(stat -c "%n" /home/user/docs/report_v2.pdf)"
3. 去掉扩展名 → 用 basename -s 或 sed/parameter expansion
推荐三种方式(按健壮性排序):
-
推荐:用 bash 参数扩展(无需外部命令,支持空格)
f=$(basename "$(stat -c "%n" "$file_path")"); echo "${f%.*}" -
兼容旧版:basename -s(GNU coreutils ≥8.25)
basename -s .pdf "$(stat -c "%n" "$file_path")"(需已知扩展名) -
通用正则:用 sed 去掉最后一个点及之后内容
basename "$(stat -c "%n" "$file_path")" | sed 's/\.[^.]*$//'
4. 实际自动化命名示例(生成新文件名)
比如把 `/var/log/app/error_2024-05-20.log` 转为 `error_2024-05-20_processed.txt`:
src="/var/log/app/error_2024-05-20.log"
base=$(basename "$src")
name="${base%.*}" # → error_2024-05-20
ext="${base##*.}" # → log(可选,用于判断)
newname="${name}_processed.txt"
echo "$newname" # → error_2024-05-20_processed.txt
注意:stat -c "%n" 在脚本中应配合双引号变量使用,避免路径含空格或特殊字符时报错。若处理多个文件,建议用循环 + find 或数组,而非管道 xargs(易受换行符干扰)。
不复杂但容易忽略细节。











