You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本判断文件路径与文件名异常的问题求助

问题解决:区分带路径的文件与纯文件名的Bash脚本修复

我需要判断输入内容是仅文件名还是包含路径的文件路径,比如输入带路径的文件D:\SYSTEM\System\Quality controlled songs\My drip Confession.flac或者仅文件名My drip Confession.flac。但我写的Bash脚本在输入带路径的文件时,错误输出“Extracting Filename: $filename”,没执行路径处理逻辑,求修复方法。

原脚本代码:

#checks if the input is a directory 
if [[ -d $filename ]]; then
    echo "Extracting Filename and Directory: $filename "
    #this extracts the directory of the input
    directory=$(dirname "$filename")

    #this extracts the filename of the input
    filename=$(basename "$filename")

     #this makes the rest of the code execute in the input directory
     cd "$directory"

#checks if the input is a file
elif [[ -f $filename ]]; then
    echo "Extracting Filename: $filename "

else
    echo "Invalid input: $filename "
    exit 1
fi

问题原因

你的脚本逻辑完全错了:-d是用来判断给定路径是不是目录,但带路径的文件本质还是文件,不是目录,所以会直接走到elif [[ -f $filename ]]分支,自然只会输出文件名的提示。你要做的是区分「输入是否包含路径」,而非「输入是目录还是文件」。

修复后的脚本

要判断输入是否包含路径,最简单的方式是用dirname命令:如果输入是纯文件名,dirname返回的结果是.(当前目录);如果包含路径,返回的就是对应的路径部分。修改后的脚本如下:

# 判断输入是否包含路径(dirname结果不是当前目录)
if [[ $(dirname "$filename") != "." ]]; then
    echo "提取文件名和路径: $filename"
    # 提取目录部分
    directory=$(dirname "$filename")
    # 提取纯文件名
    filename=$(basename "$filename")
    # 切换到目标目录,失败则退出
    cd "$directory" || exit 1
elif [[ -f "$filename" ]]; then
    echo "提取文件名: $filename"
else
    echo "无效输入: $filename"
    exit 1
fi

补充说明

  • 如果是在WSL环境处理Windows风格路径(带\分隔符),可以先把路径转换为Unix风格,在脚本开头加一行:
    filename=${filename//\\//}
    
  • cd "$directory" || exit 1的作用是防止切换目录失败后,后续代码在错误的目录执行,避免意外问题。

内容的提问来源于stack exchange,提问作者MobyGaming

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 12:05:01