./ および ../ ディレクトリを実際の名前に置き換えます。

./ および ../ ディレクトリを実際の名前に置き換えます。

ユーザーが指定したディレクトリからファイルを検索するスクリプトがあります。

#!/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/

これは、シェルが実行する操作とは異なる場合がありますcd ..。たとえば、Bashのcd ../..fromは/tmp/b/c新しいパスをas/tmp/ではないとマークします/tmp/x

答え2

いくつかの考え:

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

parent="$(
   cd ..
   pwd
)"

答え3

cdまず使用して..から使用してください$PWD

関連情報