बैश में, अगर VAR="/home/me/mydir/file.c"
, मुझे कैसे मिलेगा "/home/me/mydir"
?
बैश में, अगर VAR="/home/me/mydir/file.c"
, मुझे कैसे मिलेगा "/home/me/mydir"
?
जवाबों:
dirname
और basename
वे उपकरण हैं जिन्हें आप पथ घटकों को निकालने के लिए देख रहे हैं:
$ VAR=/home/me/mydir/file.c
$ DIR=$(dirname "${VAR}")
$ echo "${DIR}"
/home/me/mydir
$ basename "${VAR}"
file.c
वे आंतरिक बैश कमांड नहीं हैं, लेकिन वे POSIX मानक का हिस्सा हैं (देखें dirname
, basename
) और इसलिए सिस्टम के विशाल बहुमत पर उपलब्ध होना चाहिए जो बैश चल रहा होगा।
$ export VAR=/home/me/mydir/file.c
$ export DIR=${VAR%/*}
$ echo "${DIR}"
/home/me/mydir
$ echo "${VAR##*/}"
file.c
के साथ निर्भरता से बचने के लिए basename
औरdirname
संबंधित नोट पर, यदि आपके पास केवल फ़ाइल नाम या संबंधित पथ है, तो dirname
अपने आप मदद नहीं करेगा। मेरे लिए, जवाब समाप्त हो रहा है readlink
।
fname='txtfile'
echo $(dirname "$fname") # output: .
echo $(readlink -f "$fname") # output: /home/me/work/txtfile
आप केवल निर्देशिका प्राप्त करने के लिए दोनों को जोड़ सकते हैं।
echo $(dirname $(readlink -f "$fname")) # output: /home/me/work
readlink -m "$fname"
पुनरावर्ती रूप से दिए गए नाम को कैनोनिकलाइज़ करने के लिए उपयोग करना चाहिए
यदि आप लक्ष्य फ़ाइलों को प्रतीकात्मक लिंक होने की परवाह करते हैं, तो सबसे पहले आप इसकी जांच कर सकते हैं और मूल फ़ाइल प्राप्त कर सकते हैं। अगर नीचे दिए गए क्लॉज़ से आपको मदद मिल सकती है।
if [ -h $file ]
then
base=$(dirname $(readlink $file))
else
base=$(dirname $file)
fi
मैं इसके साथ खेल रहा था और एक विकल्प के साथ आया था।
$ VAR=/home/me/mydir/file.c
$ DIR=`echo $VAR |xargs dirname`
$ echo $DIR
/home/me/mydir
मुझे जो हिस्सा पसंद आया वह यह है कि पेड़ को बैकअप देना आसान था:
$ 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