উইন্ডোজ ফাইলপথ লিনাক্স ফাইলপথে রূপান্তরিত


13

আমার কাছে স্ট্রিং হিসাবে ব্যাশ ভেরিয়েবলের একটি উইন্ডোজ পাথ রয়েছে:

file='C:\Users\abcd\Downloads\testingFile.log'

আমি এই পথটি দিয়ে শুরু করে একটি লিনাক্স পথে রূপান্তর করার চেষ্টা করছি /c/Users...

আমার চেষ্টা

নিম্নলিখিত কাজগুলি:

file=${file/C://c}
file=${file//\\//}
echo $file
> /c/Users/abcd/Downloads/testingFile.log

সমস্যা

এখানে, আমি এটি স্ট্রিংয়ের জন্য করেছি যাতে ফাইলপথ রয়েছে। আমি এই প্রশ্নটি জিজ্ঞাসা করার কারণটি হ'ল আমাকে উবুন্টু ১.0.০৪-তে একটি বাশ স্ক্রিপ্টে এই জাতীয় ২০ টি স্ট্রিং রূপান্তর করতে হবে এবং প্রতিবার আমি যখন এটি করি তখন প্রতি রূপান্তর অনুসারে আমাকে 2 টি লাইন লিখতে হয় - এটি প্রচুর স্থান গ্রহণ করে!

প্রশ্ন

2 কমান্ড একত্রিত করার উপায় আছে কি?

file=${file/C://c}
file=${file//\\//}

এক আদেশে?


1
লুপের জন্য একটি ব্যবহার করুন (এবং সম্ভবত কোনও অ্যারে)। আপনার ভেরিয়েবলগুলিও উদ্ধৃত করুন।
wjandrea

ধন্যবাদ। লুপ বা অ্যারেতে এটি কীভাবে করা যায় তার একটি উদাহরণ আপনি দেখাতে পারেন?
এডেজ

উত্তর:


17

একবারে ব্যবহার করে উভয় প্রতিস্থাপন করার একটি উপায় থাকবে sedতবে এটি প্রয়োজনীয় নয়।

আমি কীভাবে এই সমস্যাটি সমাধান করব তা এখানে:

  1. অ্যারে ফাইলের নাম রাখুন
  2. অ্যারের ওপরে Iterate

filenames=(
  'C:\Users\abcd\Downloads\testingFile.log'
  # ... add more here ...
)

for f in "${filenames[@]}"; do
  f="${f/C://c}"
  f="${f//\\//}"
  echo "$f"
done

আপনি যদি মুদ্রণের পরিবর্তে আউটপুটটিকে একটি অ্যারেতে রাখতে চান তবে echoলাইনটি একটি অ্যাসাইনমেন্টের সাথে প্রতিস্থাপন করুন :

  filenames_out+=( "$f" )

ঠিক আছে। তবে আমার কাছে যদি 2 টি ফাইল থাকে f1এবং f2কীভাবে এটি কাজ করবে? আমার অর্থ, পুরানোগুলি প্রতিস্থাপন করে আমি কীভাবে নতুন ফাইলের নামগুলি অ্যারেগুলিতে পুনরায় নিয়োগ করব?
এডেজ

@WR তাদের একটি নতুন অ্যারে রাখুন এবং এটি ব্যবহার করুন।
মুড়ু

@WR এটিকে উত্তরে যুক্ত করেছে
wjandrea

1
আমি স্বচ্ছতার জন্য একটি নতুন অ্যারে তৈরি করার পরামর্শ দেব।
wjandrea

9

এটি এমন কিছু যদি আপনি বহুবার করতে চান তবে কেন একটি ছোট শেল ফাংশন তৈরি করবেন না?

win2lin () { f="${1/C://c}"; printf '%s\n' "${f//\\//}"; }

$ file='C:\Users\abcd\Downloads\testingFile.log'
$ win2lin "$file"
/c/Users/abcd/Downloads/testingFile.log
$ 
$ file='C:\Users\pqrs\Documents\foobar'
$ win2lin "$file"
/c/Users/pqrs/Documents/foobar

এটি কোনও খারাপ ধারণা নয়। তবে এটি দেবে বলে মনে হচ্ছে না /c/Users...- পরিবর্তে দিচ্ছে C:\Users\...
এডেজ

@ ডাব্লুআর ক্ষমাপ্রার্থী - কপি পেস্ট ত্রুটি। দয়া করে এটি এখন চেষ্টা করুন।
স্টিল্ড্রাইভার

1
ধন্যবাদ, আমি cdw () { f="${1/D://d}"; cd "/mnt${f//\\//}"; }লিনাক্সের জন্য উইন্ডোজ সাবসিস্টেম ব্যবহার করি , একটি কবজির মতো কাজ করি!
উইকেন্ডে

2

আপনি সেড ব্যবহার করে এক লাইনে এটি অর্জন করতে সক্ষম হবেন

file="$(echo "$file" | sed -r -e 's|^C:|/c|' -e 's|\\|/|g')"

নোটগুলি দুটি প্যাটার্নগুলি অবশ্যই পৃথক থাকতে হবে কারণ ম্যাচগুলি বিভিন্ন প্রতিস্থাপনের দ্বারা প্রতিস্থাপিত হয়।


1
file="$(sed 's|^C:|/c|; s|\\|/|g' <<< "$file")"
প্রতিশব্দ

1

এই প্রশ্নটি কি এখনও নতুন পরামর্শের জন্য উন্মুক্ত? যদি তাই হয়, এটি কি আপনাকে সাহায্য করবে?

$ file="/$(echo 'C:\Users\abcd\Downloads\testingFile.log'|tr '\\' '/')"
$ echo $file
/C:/Users/abcd/Downloads/testingFile.log

ওহ, এবং সেক্ষেত্রে সি অবশ্যই ছোট হাতের কাছে ফেলে দিতে হবে:

file="/$(echo 'C:\Users\abcd\Downloads\testingFile.log'|tr '^C' 'c'|tr '\\' '/')"

ওভারভিউ হিসাবে:

$ file='C:\Users\abcd\Downloads\testingFile.log'
$ echo $file
C:\Users\abcd\Downloads\testingFile.log
$ file="/$(echo $file|tr '^C' 'c'|tr '\\' '/')"
$ echo $file
/c:/Users/abcd/Downloads/testingFile.log

ব্যবহারের কারণ কী '^C'?
এডেজ

1
^ এর অর্থ লাইনটি শুরু করা, অন্যথায় সি এর সমস্ত উপস্থিতি ছোট হাতের অক্ষরে পরিণত হবে ... কোনও কিছু থাকা উচিত

আমি অবশ্যই যুক্ত করব যে অন্যান্য পরামর্শগুলিও কাজ করে। অনেকগুলি ইউনিক্স কমান্ড একই কাজ করতে পারে, তাই আপনি কোন স্টাইলের সমাধানটি ব্যবহার করতে পছন্দ করেন তা নির্ভরযোগ্য।

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