如何从完整文件路径中提取目录

How to extract the directory from full file path

我有以下脚本打印各种文件统计信息,这是由另一位用户 (choroba) () 友情提供的。

有没有一种方法可以将其修改为只报告每个文件的目录名而不是包含文件名的完整文件路径?我尝试使用 dirname 更改文件路径,但出现一系列错误,提示没有这样的文件或目录。感谢您的任何建议。

#!/bin/bash
set -eu

filepath=
qfilepath=${filepath//\/\\}   # Quote backslashes.
qfilepath=${qfilepath//\"/\\"}  # Quote doublequotes.

file=${qfilepath##*/}            # Remove the path.

stats=($(stat -c "%s %W %Y" "$filepath"))
size=${stats[0]}
ctime=$(date --date @"${stats[1]}" +'%d/%m/%Y %H:%M:%S')
mtime=$(date --date @"${stats[2]}" +'%d/%m/%Y %H:%M:%S')

md5=$(md5sum < "$filepath")
md5=${md5%% *}                   # Remove the dash.

printf '"%s","%s",%s,%s,%s,%s\n' \
        "$file" "$qfilepath" "$size" "$ctime" "$mtime" $md5

虽然我在脚本片段中没有看到任何会产生递归列表的内容,但您可以通过添加 dir=$(dirname $filepath) 并修改 printf 输出以使用 $dir 而不是来获取目录名称输出$file.

您可以使用 dirnamebasename 的组合,其中:

dirname 将从完整路径中删除最后一个组件;

basename 将从路径中获取最后一个组件。

总结一下:$(basename $(dirname $qfilepath)) 将为您提供路径中最后一个目录的名称。 或者,对于没有文件名的完整路径 - 只需 $(dirname $qfilepath).