2012-06-27 17 views
44

मैं एक bash स्क्रिप्ट लिखने की कोशिश कर रहा हूँ बनाने के लिए। इस स्क्रिप्ट में मैं चाहता हूं कि उपयोगकर्ता निर्देशिका का पथ दर्ज करे। फिर मैं इस स्ट्रिंग के अंत में कुछ स्ट्रिंग जोड़ना चाहता हूं और कुछ उपनिर्देशिकाओं के लिए पथ बनाना चाहता हूं। उदाहरण के लिए मान उपयोगकर्ता इस तरह की एक स्ट्रिंग में प्रवेश करती है:दो तार जोड़ कैसे एक पूर्ण पथ

/home/user1/MyFolder 

अब मैं इस निर्देशिका में 2 उपनिर्देशिका बना सकते हैं और वहाँ कुछ फ़ाइलों की प्रतिलिपि बनाना चाहते हैं।

/home/user1/MyFolder/subFold1 
/home/user1/MyFolder/subFold2 

मैं यह कैसे कर सकता हूं?

+1

क्या आप अब तक की कोशिश की? साथ ही, उपयोगकर्ता से इनपुट प्राप्त करने के बारे में आपके प्रश्न का हिस्सा है, और पथ बनाने के बारे में दूसरा हिस्सा? या सिर्फ रास्ता? – Levon

+0

बस पथ बनाना। – Hakim

उत्तर

9

बस अपने पथ का हिस्सा श्रृंखलाबद्ध नहीं होगा पूरा आप क्या चाहते हैं?

$ base="/home/user1/MyFolder" 
$ subdir="subFold1" 
$ new_path=$base$subdir 
$ echo $new_path 
/home/user1/MyFoldersubFold1 

फिर आप आवश्यकतानुसार फ़ोल्डर/निर्देशिका बना सकते हैं।

+3

मुझे यह संदेश क्यों मिलता है: Myscript.sh: line 4:/home/user1/MyFolder/subFold1: निर्देशिका – Hakim

+1

है आप पथ से/एक अनुपलब्ध हैं। लक्ष्य इनलाइन '/ घर/user1/MyFolder/subFold1' ताकि आप इनलाइन की आवश्यकता होगी' new_path = $ आधार/$ subdir' है। लेकिन फिर यदि आप दिए गए पथ में पीछे की ओर '/' शामिल है तो आप क्या करते हैं? – Thrasi

+1

@ थ्रसी बस उपशीर्षक या 'newpath = $ base/$ subdir /' पर पीछे की ओर '/' जोड़ें, आप सीधे इसके साथ कमांड लाइन – user12345

30
#!/bin/bash 

read -p "Enter a directory: " BASEPATH 

SUBFOLD1=${BASEPATH%%/}/subFold1 
SUBFOLD2=${BASEPATH%%/}/subFold2 

echo "I will create $SUBFOLD1 and $SUBFOLD2" 

# mkdir -p $SUBFOLD1 
# mkdir -p $SUBFOLD2 

और तुम ReadLine उपयोग करें ताकि आप पूरा होने और सभी कि, read करने के लिए कॉल करने के लिए एक -e जोड़ने चाहते हैं:

read -e -p "Enter a directory: " BASEPATH 
+0

दुर्भाग्य से, यह काम नहीं करता है जब BASEPATH खाली है।मुझे जो कुछ चाहिए वह ऐसा कुछ है जो केवल एक/जब यह पहले से ही स्लैश का अंत नहीं होता है और खाली नहीं होता है। इस प्रकार, जब यह एक कानूनी फ़ाइल नाम चरित्र पर समाप्त होता है। –

0
#!/usr/bin/env bash 

mvFiles() { 
    local -a files=(file1 file2 ...) \ 
      subDirs=(subDir1 subDir2) \ 
      subDirs=("${subDirs[@]/#/$baseDir/}") 

    mkdir -p "${subDirs[@]}" || return 1 

    local x 
    for x in "${subDirs[@]}"; do 
     cp "${files[@]}" "$x" 
    done 
} 



main() { 
    local baseDir 
    [[ -t 1 ]] && echo 'Enter a path:' 
    read -re baseDir 
    mvFiles "$baseDir" 
} 

main "[email protected]" 
66

POSIX मानक जनादेश कि कई / इलाज कर रहे हैं एक भी / एक फ़ाइल के नाम में के रूप में। इस प्रकार //dir///subdir////file/dir/subdir/file के समान है।

full_path="$part1/$part2" 
+2

सिवाय इसके कि $ part1 खाली स्ट्रिंग हो सकता है। –

+1

@TureLaurinolli मुझे नहीं पता कि आप कहां से आ रहे हैं। उपरोक्त concatenation अभी भी एक वैध पथ में परिणाम होगा। पथ मौजूद नहीं हो सकता है, लेकिन यह अभी भी मान्य होगा। जैसे। '" "+"/"+" दस्तावेज़ "' '/ दस्तावेज "' देता है। – Dunes

+5

यदि भागों स्वयं रिश्तेदार पथ हैं, और part1 खाली हो सकता है, तो परिणाम रिश्तेदार से पूर्ण पथ से बदल सकता है। –

3

निम्न स्क्रिप्ट catenates कई (सापेक्ष/पूर्ण) पथ (BASEPATH) एक रिश्तेदार पथ (subdir) के साथ:

इस तरह के एक दो तार श्रृंखलाबद्ध एक पूर्ण पथ का निर्माण करने के रूप में के रूप में एक सरल है

shopt -s extglob 
SUBDIR="subdir" 
for BASEPATH in ''/base base/ base// /base /base/ /base//; do 
    echo "BASEPATH = \"$BASEPATH\" --> ${BASEPATH%%+(/)}${BASEPATH:+/}$SUBDIR" 
done 

जिनमें से उत्पादन होता है:

BASEPATH = "" --> subdir 
BASEPATH = "/" --> /subdir 
BASEPATH = "base" --> base/subdir 
BASEPATH = "base/" --> base/subdir 
BASEPATH = "base//" --> base/subdir 
BASEPATH = "/base" --> /base/subdir 
BASEPATH = "/base/" --> /base/subdir 
BASEPATH = "/base//" --> /base/subdir 

shopt -s extglob BASEPATH कई स्लैश पर समाप्त करने के लिए (जो शायद बकवास है) की अनुमति के लिए केवल आवश्यक है। बिना globing बढ़ाया तुम सिर्फ उपयोग कर सकते हैं:

echo ${BASEPATH%%/}${BASEPATH:+/}$SUBDIR 

जो कम साफ है लेकिन अभी भी काम करने में परिणाम होगा:

BASEPATH = "" --> subdir 
BASEPATH = "/" --> /subdir 
BASEPATH = "base" --> base/subdir 
BASEPATH = "base/" --> base/subdir 
BASEPATH = "base//" --> base//subdir 
BASEPATH = "/base" --> /base/subdir 
BASEPATH = "/base/" --> /base/subdir 
BASEPATH = "/base//" --> /base//subdir 
संबंधित मुद्दे