अगर मेरे पास कोई फ़ाइल पथ है जैसे ...
/home/smith/Desktop/Test
/home/smith/Desktop/Test/
मैं स्ट्रिंग कैसे बदलूं, इसलिए यह मूल निर्देशिका होगी?
जैसे
/home/smith/Desktop
/home/smith/Desktop/
अगर मेरे पास कोई फ़ाइल पथ है जैसे ...
/home/smith/Desktop/Test
/home/smith/Desktop/Test/
मैं स्ट्रिंग कैसे बदलूं, इसलिए यह मूल निर्देशिका होगी?
जैसे
/home/smith/Desktop
/home/smith/Desktop/
जवाबों:
dir=/home/smith/Desktop/Test
parentdir="$(dirname "$dir")"
काम करता है अगर वहाँ एक अनुगामी स्लेश है, भी।
parentdir=$(dirname `pwd`)
केवल echo $(cd ../ && pwd)
उस निर्देशिका में काम करते समय उपयोग करें , जिसका मूल आप जानना चाहते हैं। इस श्रृंखला में ट्रेलिंग स्लैश न होने का अतिरिक्त लाभ भी है।
echo
यहाँ की जरूरत नहीं है।
स्पष्ट रूप से मूल निर्देशिका केवल डॉट-डॉट फ़ाइल नाम जोड़कर दी गई है:
/home/smith/Desktop/Test/.. # unresolved path
लेकिन आपको हल किया हुआ पथ (किसी भी डॉट-डॉट पथ घटकों के बिना एक पूर्ण पथ) चाहिए:
/home/smith/Desktop # resolved path
उपयोग करने वाले शीर्ष उत्तरों के साथ समस्या यह dirname
है कि वे डॉट-डॉट्स के साथ एक पथ में प्रवेश करते समय काम नहीं करते हैं:
$ dir=~/Library/../Desktop/../..
$ parentdir="$(dirname "$dir")"
$ echo $parentdir
/Users/username/Library/../Desktop/.. # not fully resolved
यह अधिक शक्तिशाली है :
dir=/home/smith/Desktop/Test
parentdir=`eval "cd $dir;pwd;cd - > /dev/null"`
आप इसे फ़ीड कर सकते हैं /home/smith/Desktop/Test/..
, लेकिन और भी जटिल रास्ते जैसे:
$ dir=~/Library/../Desktop/../..
$ parentdir=`eval "cd $dir;pwd;cd - > /dev/null"`
$ echo $parentdir
/Users # the fully resolved path!
संपादित करें: यदि यह काम नहीं करता है, तो जांच लें कि आपका cd
संशोधन नहीं हुआ है, जैसा कि कभी-कभी आम बात है,
$ which cd
cd is a function #cd was modified to print extra info, so use "builtin cd" to override
cd ()
{
builtin cd "$@";
ls -FGAhp
}
...
eval
बहुत अच्छा नहीं है यदि उपयोगकर्ता इनपुट को पार्स करने का कोई मौका है जो आपको कहीं रख सकता है जो आप उम्मीद नहीं करते हैं या आपके सिस्टम के खिलाफ खराब चीजें चला सकते हैं। आप के pushd $dir 2>&1 >/dev/null && pwd && popd 2>&1 >/dev/null
बजाय का उपयोग कर सकते हैं eval
?
eval
: बस करो parentdir=$(cd -- "$dir" && pwd)
। चूंकि यह cd
एक सबशेल में चलाया जाता है, इसलिए आपको उस स्थान पर cd
वापस जाने की आवश्यकता नहीं है जहां हम थे। --
यहां मामले में के विस्तार है $dir
हाइफ़न से शुरू होता है। &&
बस रोकने के लिए है parentdir
जब एक गैर खाली सामग्री के लिए cd
सफल नहीं हुए।
मुझे बहुत छोटा, स्पष्ट, गारंटीकृत कोड पसंद है। बोनस बिंदु अगर यह एक बाहरी कार्यक्रम नहीं चलाता है, तो जिस दिन से आपको बड़ी संख्या में प्रविष्टियों को संसाधित करने की आवश्यकता होती है, यह काफी तेजी से होगा।
आपके पास क्या गारंटी है और क्या चाहते हैं, इस बारे में निश्चित नहीं है, इसलिए वैसे भी पेश करना।
यदि आपके पास गारंटी है तो आप इसे बहुत कम कोड के साथ कर सकते हैं। अंतिम स्लैश और जो कुछ भी है, उसे काटने के लिए बैश टेक्स्ट प्रतिस्थापन सुविधा का उपयोग करने का विचार है।
मूल प्रश्न के सरल से अधिक जटिल मामलों का उत्तर दें।
P=/home/smith/Desktop/Test ; echo "${P%/*}"
/home/smith/Desktop
P=/home/smith/Desktop/Test/ ; echo "${P%/*/}/"
/home/smith/Desktop/
for P in \
/home/smith/Desktop/Test \
/home/smith/Desktop/Test/
do
P_ENDNOSLASH="${P%/}" ; echo "${P_ENDNOSLASH%/*}"
done
/home/smith/Desktop
/home/smith/Desktop
for P in \
/home/smith/Desktop/Test \
/home/smith/Desktop/Test/ \
/home/smith///Desktop////Test//
do
P_NODUPSLASH="${P//\/*(\/)/\/}"
P_ENDNOSLASH="${P_NODUPSLASH%%/}"
echo "${P_ENDNOSLASH%/*}";
done
/home/smith/Desktop
/home/smith/Desktop
/home/smith/Desktop
${BASH_SOURCE[0]}
जिसके खिलाफ स्क्रिप्ट का पूरा रास्ता होगा यदि यह source
या के माध्यम से खट्टा नहीं था .
।
यदि /home/smith/Desktop/Test/../
आप चाहते हैं:
dirname 'path/to/child/dir'
bash: dirname 'Test': syntax error: invalid arithmetic operator (error token is "'Test'")
। लिंक किया हुआ कोड भी गलत है।
dirname Test
निर्देशिका से बस चलाने की कोशिश करो Test
।
इस बात पर निर्भर करता है कि आपको निरपेक्ष पथ की आवश्यकता है या नहीं, आप एक अतिरिक्त कदम उठाना चाहते हैं:
child='/home/smith/Desktop/Test/'
parent=$(dirname "$child")
abs_parent=$(realpath "$parent")
इसका उपयोग करें: export MYVAR="$(dirname "$(dirname "$(dirname "$(dirname $PWD)")")")"
यदि आप 4th पेरेंट डायरेक्टरी चाहते हैं
export MYVAR="$(dirname "$(dirname "$(dirname $PWD)")")"
यदि आप 3 जनक निर्देशिका चाहते हैं
export MYVAR="$(dirname "$(dirname $PWD)")"
यदि आप दूसरी मूल निर्देशिका चाहते हैं
बदसूरत लेकिन कुशल
function Parentdir()
{
local lookFor_ parent_ switch_ i_
lookFor_="$1"
#if it is not a file, we need the grand parent
[ -f "$lookFor_" ] || switch_="/.."
#length of search string
i_="${#lookFor_}"
#remove string one by one until it make sens for the system
while [ "$i_" -ge 0 ] && [ ! -d "${lookFor_:0:$i_}" ];
do
let i_--
done
#get real path
parent_="$(realpath "${lookFor_:0:$i_}$switch_")"
#done
echo "
lookFor_: $1
{lookFor_:0:$i_}: ${lookFor_:0:$i_}
realpath {lookFor_:0:$i_}: $(realpath ${lookFor_:0:$i_})
parent_: $parent_
"
}
lookFor_: /home/Om Namah Shivaya
{lookFor_:0:6}: /home/
realpath {lookFor_:0:6}: /home
parent_: /home
lookFor_: /var/log
{lookFor_:0:8}: /var/log
realpath {lookFor_:0:8}: /UNIONFS/var/log
parent_: /UNIONFS/var
lookFor_: /var/log/
{lookFor_:0:9}: /var/log/
realpath {lookFor_:0:9}: /UNIONFS/var/log
parent_: /UNIONFS/var
lookFor_: /tmp//res.log/..
{lookFor_:0:6}: /tmp//
realpath {lookFor_:0:6}: /tmp
parent_: /
lookFor_: /media/sdc8/../sdc8/Debian_Master//a
{lookFor_:0:35}: /media/sdc8/../sdc8/Debian_Master//
realpath {lookFor_:0:35}: /media/sdc8/Debian_Master
parent_: /media/sdc8
lookFor_: /media/sdc8//Debian_Master/../Debian_Master/a
{lookFor_:0:44}: /media/sdc8//Debian_Master/../Debian_Master/
realpath {lookFor_:0:44}: /media/sdc8/Debian_Master
parent_: /media/sdc8
lookFor_: /media/sdc8/Debian_Master/../Debian_Master/For_Debian
{lookFor_:0:53}: /media/sdc8/Debian_Master/../Debian_Master/For_Debian
realpath {lookFor_:0:53}: /media/sdc8/Debian_Master/For_Debian
parent_: /media/sdc8/Debian_Master
lookFor_: /tmp/../res.log
{lookFor_:0:8}: /tmp/../
realpath {lookFor_:0:8}: /
parent_: /
चार्ल्स डफी के विचार / टिप्पणी से शुरू - दिसम्बर 17 '14: 5:32 विषय पर वर्तमान निर्देशिका नाम (पूर्ण पथ के बिना) एक बैश स्क्रिप्ट में प्राप्त करें
#!/bin/bash
#INFO : /programming/1371261/get-current-directory-name-without-full-path-in-a-bash-script
# comment : by Charles Duffy - Dec 17 '14 at 5:32
# at the beginning :
declare -a dirName[]
function getDirNames(){
dirNr="$( IFS=/ read -r -a dirs <<<"${dirTree}"; printf '%s\n' "$((${#dirs[@]} - 1))" )"
for(( cnt=0 ; cnt < ${dirNr} ; cnt++))
do
dirName[$cnt]="$( IFS=/ read -r -a dirs <<<"$PWD"; printf '%s\n' "${dirs[${#dirs[@]} - $(( $cnt+1))]}" )"
#information – feedback
echo "$cnt : ${dirName[$cnt]}"
done
}
dirTree=$PWD;
getDirNames;
यदि किसी भी कारण से आप किसी विशिष्ट निर्देशिका को नेविगेट करने में रुचि रखते हैं तो आप भी कर सकते हैं nth_path=$(cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && cd ../../../ && pwd)
:। यह 3 अभिभावकों की निर्देशिका देगा
..
' का उपयोग कर सकते हैं , लेकिन हो सकता है कि जो आपके मन में था वह बिलकुल न हो।