সম্পূর্ণ পথ তৈরির জন্য দুটি স্ট্রিং কীভাবে সংযুক্ত করতে হয়


95

আমি বাশ স্ক্রিপ্ট লেখার চেষ্টা করছি। এই স্ক্রিপ্টে আমি চাই যে ব্যবহারকারী কোনও ডিরেক্টরিতে প্রবেশ করান। তারপরে আমি এই স্ট্রিংয়ের শেষে কিছু স্ট্রিং যুক্ত করতে চাই এবং কিছু উপ-ডিরেক্টরিতে একটি পথ তৈরি করতে চাই। উদাহরণস্বরূপ ধরুন ব্যবহারকারী এরকম একটি স্ট্রিং প্রবেশ করে:

/home/user1/MyFolder

এখন আমি এই ডিরেক্টরিতে 2 টি উপ-ডিরেক্টরি তৈরি করতে এবং সেখানে কিছু ফাইল অনুলিপি করতে চাই।

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

কিভাবে আমি এটি করতে পারব?


4
এ পর্যন্ত কি কি চেষ্টা করেছ? এছাড়াও, ব্যবহারকারীর কাছ থেকে ইনপুট পাওয়ার বিষয়ে আপনার প্রশ্নের অংশ এবং পথটি নির্মাণের বিষয়ে অন্য অংশটি? নাকি শুধু পথ?
লেভন

উত্তর:


136

POSIX মান ম্যান্ডেটগুলি যে একাধিক ফাইলের নামে /একক হিসাবে বিবেচিত হয় /। সুতরাং //dir///subdir////fileহিসাবে একই /dir/subdir/file

সম্পূর্ণ পথ তৈরির জন্য দুটি স্ট্রিংকে যুক্ত করা যেমন সহজ:

full_path="$part1/$part2"

11
যদি $ part1 খালি স্ট্রিং হতে পারে Ex
তিউরে লরিনোল্লি

4
@ টিউরলৌরিনোল্লি আপনি বুঝতে পারছেন না আপনি কোথা থেকে এসেছেন। উপরে বর্ণিত কনটেন্টেশনটি এখনও একটি বৈধ পথের ফলাফল করবে। পথটি নাও থাকতে পারে তবে এটি বৈধ হবে be যেমন "" + "/" + "Documents"দেয় "/Documents"
ডেনস

17
অংশগুলি যদি আপেক্ষিক পাথ হয় এবং অংশ 1 খালি থাকতে পারে তবে ফলাফলটি আপেক্ষিক থেকে পরম পথে যেতে পারে turn
তিউরে লরিনোল্লি

4
@TuureLaurinolli এর পরে আপনি কেবল ./সামনের দিকে যুক্ত করতে পারেন। তবে হয়ত ব্যবহারকারী চায় পরম পাথগুলি সংক্ষেপ । অন্যথায় তারা কেবল ./পথটিকে আপেক্ষিক হতে বাধ্য করার জন্য সামনের দিকে যুক্ত করতে পারে। এছাড়াও নোট যে "$path1/./$path2"একই "$path1/$path2"
yyny

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

এবং আপনি যদি রিডলাইন ব্যবহার করতে চান যাতে আপনি সম্পূর্ণতা পান এবং সমস্ত কিছু, -eকলটিতে একটি যুক্ত করুন read:

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

4
দুর্ভাগ্যক্রমে, যখন বাসপথ খালি থাকে তখন এটি কাজ করে না। আমার যা দরকার তা হ'ল এটি এমন একটি যুক্ত করে যখন এটি ইতিমধ্যে কোনও স্ল্যাশ শেষ করে না এবং খালি নয়। সুতরাং, যখন এটি কোনও আইনী ফাইলনাম অক্ষরে শেষ হয়।
কার্লো উড

17

আপনার পথের অংশটি কেবল যা চান তা পূরণ করবেন না?

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

তারপরে আপনি প্রয়োজনীয় ফোল্ডার / ডিরেক্টরি তৈরি করতে পারেন।

একটি কনভেনশন হ'ল ডিরেক্টরি পাথগুলি /(উদাহরণস্বরূপ /home/) দিয়ে শেষ করা কারণ / দিয়ে শুরু হওয়া পাথগুলি রুট ডিরেক্টরিতে বিভ্রান্ত হতে পারে। যদি কোনও পথে ডাবল স্ল্যাশ ( //) ব্যবহার করা হয় তবে এটি এখনও সঠিক। তবে, যদি কোনও চলকগুলিতে কোনও স্ল্যাশ ব্যবহার না করা হয় তবে এটি ভুল (যেমন /home/user1/MyFoldersubFold1))


4
আমি কেন এই বার্তাটি পেয়েছি: মাইক্রিপ্ট.শ: লাইন 4: / হোম / ইউজার 1 / মাইফোল্ডার / সাবফোল্ড 1: একটি ডিরেক্টরি
হাকিম

4
আপনি পথ থেকে একটি হারিয়েছেন। লক্ষ্যটি ইনলাইন /home/user1/MyFolder/subFold1 যাতে আপনার ইনলাইন প্রয়োজন new_path=$base/$subdir। তবে যদি প্রদত্ত পথে কোনও '/' অন্তর্ভুক্ত থাকে তবে আপনি কী করবেন?
থ্রেসি

4
@ থ্রাসি কেবল '/' কে কেবল সাবডির ভেরিয়েবলের সাথে যুক্ত করুন বা newpath=$base/$subdir/আপনি এটির সাথে সরাসরি কমান্ড লাইনে খেলতে পারেন
ইউজার 12345

4
@ ব্যবহারকারী 12345, হ্যাঁ ... এখনও উপরে সমাধানটি ভুল রেখে গেছে।
থ্রেসি

5

নিম্নলিখিত লিপিটি আপেক্ষিক পথ (SUBDIR) সহ বেশ কয়েকটি (আপেক্ষিক / পরম) পাথ (BASEPATH) কেটেট করে:

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 একাধিক স্ল্যাশ কল্পনার অবসান হতে যাচ্ছে (যা সম্ভবত আজেবাজে কথা হয়) অনুমতি প্রয়োজন। প্রসারিত গ্লোবিং ছাড়া আপনি কেবল ব্যবহার করতে পারেন:

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

1

আমি আমার শেল স্ক্রিপ্ট নিয়ে কাজ করছিলাম যা আপনার মতো করে কিছু যোগ করার মতো পথ তৈরি করা দরকার।

জিনিসটি হ'ল উভয় পথের মতো

/data/foo/bar

/data/foo/bar/ 

বৈধ হয়।

আমি যদি এই পথে কোনও ফাইল যুক্ত করতে চাই তবে

/data/foo/bar/myfile

এ জাতীয় পরিস্থিতি পরিচালনা করার জন্য শেলের মধ্যে কোনও নেটিভ পদ্ধতি ছিল না (যেমন পাইথনে os.path.join ())।

তবে আমি একটি কৌশল খুঁজে পেয়েছি

উদাহরণস্বরূপ, বেস পাথটি শেল ভেরিয়েবলের মধ্যে স্টোর ছিল

BASE=~/mydir

এবং আপনি যে সর্বশেষ ফাইলের নামটিতে যোগদান করতে চান তা ছিল

FILE=myfile

তারপরে আপনি নিজের নতুন পথটি এভাবে নির্ধারণ করতে পারেন

NEW_PATH=$(realpath ${BASE})/FILE

এবং তারপর আপনি পাবেন

$ echo $NEW_PATH

/path/to/your/home/mydir/myfile

কারণটি সহজ সহজ, "রিয়েলপথ" কমান্ডটি প্রয়োজনবোধে আপনার জন্য সর্বদা সমাপ্তি স্ল্যাশটি ছাঁটাবে


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 "$@"

0

এটি খালি দিরের জন্য কাজ করা উচিত (দ্বিতীয় স্ট্রিংটি শুরু হয় /যা দিয়ে নিরঙ্কুশ পথ হিসাবে বিবেচনা করা উচিত তা আপনার চেক করা দরকার ?):

#!/bin/bash

join_path() {
    echo "${1:+$1/}$2" | sed 's#//#/#g'
}

join_path "" a.bin
join_path "/data" a.bin
join_path "/data/" a.bin

আউটপুট:

a.bin
/data/a.bin
/data/a.bin

তথ্যসূত্র: শেল প্যারামিটার সম্প্রসারণ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.