विंडोज़ फ़ाइलपथ लिनक्स फ़ाइलपथ में परिवर्तित हो गया


13

मेरे पास एक स्ट्रिंग के रूप में bash वैरिएबल में एक Windows पथ है:

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

मैं इस पथ को एक लिनक्स पथ में बदलने की कोशिश कर रहा हूं जिसके साथ शुरू हो रहा है /c/Users...

मेरा प्रयास

निम्नलिखित कार्य:

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

मुसीबत

यहां, मैंने ऐसा एक स्ट्रिंग के लिए किया है जिसमें फ़ाइलपथ शामिल है। मैं यह प्रश्न पूछ रहा हूं, क्योंकि मुझे उबंटू की स्क्रिप्ट में २०.०४ में २० ऐसे तार बदलने हैं और हर बार जब मुझे ऐसा करना होता है तो मुझे प्रति रूपांतरण २ लाइनें लिखनी पड़ती हैं - यह बहुत जगह ले रहा है!

सवाल

क्या 2 कमांड को संयोजित करने का एक तरीका है

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

एक आदेश में?


1
लूप के लिए उपयोग करें (और शायद एक सरणी)। अपने चर को भी उद्धृत करें।
वेजेंड्रिया

धन्यवाद। क्या आप इसका उदाहरण दिखा सकते हैं कि यह कैसे एक पाश या सरणी में किया जाता है?
एडीज़

जवाबों:


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\...
edesz

@WR माफी - कॉपी-पेस्ट त्रुटि। कृपया इसे आजमाएँ।
स्टीलड्राइवर

1
धन्यवाद, मैं cdw () { f="${1/D://d}"; cd "/mnt${f//\\//}"; }लिनक्स के लिए विंडोज सबसिस्टम में उपयोग करता हूं , एक आकर्षण की तरह काम करता है!
सप्ताहांत

2

आप इसे एक पंक्ति में sed का उपयोग करके प्राप्त करने में सक्षम होंगे

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

ध्यान दें कि दो पैटर्न अलग-अलग होने चाहिए, क्योंकि मैच अलग-अलग प्रतिस्थापन द्वारा प्रतिस्थापित किए जाते हैं।


1
पर्यायवाची:file="$(sed 's|^C:|/c|; s|\\|/|g' <<< "$file")"
wjandrea

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'?
edesz

1
^ लाइन की शुरुआत का मतलब है, अन्यथा सी की सभी

मुझे यह जोड़ना चाहिए कि अन्य सुझाव भी काम करते हैं। कई यूनिक्स कमांड एक ही काम कर सकते हैं, इसलिए यह आपके ऊपर है कि आप किस शैली के समाधान का उपयोग करना पसंद करते हैं।

मैंने इसके बारे में पहले नहीं पूछा था ^कि यहाँ कुछ अन्य उत्तरों में भी इसका उपयोग किया गया है। उत्तर और स्पष्टीकरण के लिए धन्यवाद।
edesz
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.