在Bash中,若是VAR="/home/me/mydir/file.c"
,我該如何得到"/home/me/mydir"
? spa
$ export VAR=/home/me/mydir/file.c $ export DIR=${VAR%/*} $ echo "${DIR}" /home/me/mydir $ echo "${VAR##*/}" file.c
避免依賴basename
和dirname
code
若是您關注目標文件是符號連接,首先您能夠檢查它並獲取原始文件。 如下if條款能夠幫助您。 遞歸
if [ -h $file ] then base=$(dirname $(readlink $file)) else base=$(dirname $file) fi
在相關的說明中,若是您只有文件名或相對路徑,則dirname
自己無濟於事。 對我來講,答案最終是readlink
。 擴展
fname='txtfile' echo $(dirname "$fname") # output: . echo $(readlink -f "$fname") # output: /home/me/work/txtfile
而後,您能夠將二者合併爲一個目錄。 file
echo $(dirname $(readlink -f "$fname")) # output: /home/me/work
我正在玩這個,想出了另外一種選擇。 腳本
$ VAR=/home/me/mydir/file.c $ DIR=`echo $VAR |xargs dirname` $ echo $DIR /home/me/mydir
我喜歡的部分是擴展備份樹很容易: di
$ DIR=`echo $VAR |xargs dirname |xargs dirname |xargs dirname` $ echo $DIR /home
這是我用於遞歸修剪的腳本。 固然,將$ 1替換爲您想要的目錄。 文件
BASEDIR="$1" IFS=$'\n' cd $BASEDIR for f in $(find . -type f -name ' *') do DIR=$(dirname "$f") DIR=${DIR:1} cd $BASEDIR$DIR rename 's/^ *//' * done