用实际名称替换 ./ 和 ../ 目录

用实际名称替换 ./ 和 ../ 目录

我有一个脚本可以在用户指定的目录中查找文件。

#!/bin/bash

# make sure about the correct input
if [ -z $1 ]
then
    echo "Usage: ./script_name.sh    path/to/directory"
else
    DIR=$1
    if [ $DIR = '.' ]
    then 
        echo "Find files in the directory $PWD"
    else  
        echo "Find files in the directory $DIR"
    fi

    find $DIR -type f -exec basename {} \; 
fi

如果我输入

$ ./script_name.sh .

脚本给了我正确的替换 ./ 到 $PWD 并显示(例如)

$ Find files in the directory /root/scripts  

但我无法做出决定如何将 ../ 替换为目录名称 位于层次结构的上方。如果我输入

$ ./script_name.sh ..  

脚本给我输出

$ Find files in the directory ..  

有谁知道如何将 ../ 替换为目录的实际名称?

答案1

GNU coreutils 有realpath命令就是这么做的。

/tmp/a$ realpath ..
/tmp

但请注意,如果路径包含符号链接,它也会解析这些符号链接:

/tmp/b/c$ realpath ..
/tmp/x/y

(这里/tmp/b是一个符号链接/tmp/x/y/

这可能与 shell 所做的不同cd ..。例如, Bash 中cd ../..的 from/tmp/b/c将新路径显示为/tmp/,而不是 as /tmp/x

答案2

一些想法:

parent="$(dirname "$(pwd)")"

parent="$(
   cd ..
   pwd
)"

答案3

您可以先cd使用..然后使用$PWD.

相关内容