एकाधिक फ़ाइलों का पता लगाने और उन्हें कैसे खोलें?


10

मान लीजिए कि मेरे पास एक फ़ाइल है जिसका नाम है filename123.txtऔर यह एकल फ़ाइल है जिसे नाम दिया गया है, और मैं locateइसे कमांड के साथ कर सकता हूं locate filename123। और यह केवल इस फाइल को लौटाता है।

अब मैं इसे vi/ के साथ खोलना चाहता हूं vim। लेकिन मैं उस स्थान पर नहीं जाना चाहता और viफाइलनाम के बाद कमांड टाइप करता हूं । यहां मैं चाहता हूं कि परिणाम locate filename123vi कमांड में जोड़ा जाए। ऐसा मैं किस प्रकार करूं? मैंने पहले ही कोशिश की:

locate filename123 | vi

लेकिन यह काम नहीं करता है। और यह त्रुटि टर्मिनल में आती है:

santosh@santosh:~$ locate filename123 | vi
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: Finished.

जवाबों:


12

आप उपयोग कर सकते हैं xargs:

locate filename123 | xargs vi

डिफ़ॉल्ट xargsरूप से संभव कमांड के कुछ उदाहरणों के रूप में निष्पादित करेगा, सिस्टम के ARG_MAX के अनुसार कई मापदंडों को पारित करना । उदाहरण के लिए दिए गए मापदंडों की संख्या को सीमित करने के लिए vi, xargs' -nविकल्प का उपयोग करें ।

रिक्त स्थान का उपयोग करने वाले फ़ाइल नामों को संभालने के लिए xargs' -dविकल्प:

locate filename123 | xargs -d '\n' vi

फ़ाइल नई-पंक्तियों का उपयोग युक्त नामों को संभालने के लिए xargs' -0के साथ एक साथ विकल्प locates' -0विकल्प:

locate -0 filename123 | xargs -0 vi

(यदि -0उनमें से किसी पर भी उपलब्ध नहीं है, तो --nullभी या \000सीमांकक के रूप में वर्ण निर्दिष्ट करने के लिए एक और तरीका देखें ।)


क्या आप बता सकते हैं कि इस फाइल को खोलने से पहले मुझे क्या रोका गया था?
संतोष कुमार

1
@ संतोष आप vi के इनपुट केlocate रूप में कमांड का आउटपुट पास कर रहे थे । Vi, किसी भी अन्य कार्यक्रम की तरह, फ़ाइल के नाम की अपेक्षा करता है कि वह तर्कों के रूप में काम करेगा।
गिलेस एसओ- बुराई को रोकना '

@manatwork समस्या यह है कि मैं इसका पता नहीं लगा सकता और इसमें रिक्त स्थान के साथ फ़ाइल नाम नहीं खोल सकता। उदाहरण के लिए, यह कमांड vim में कई फाइलें खोलेगी: I \ have to \ download का पता लगाएं xargs vi
संतोष कुमार

3

आप कमांड विस्तार का उपयोग कर सकते हैं:

vi "$(locate filename123 | head -n1)"

vimइसकी स्टडी को पढ़ने के लिए आप कर सकते हैं vim -, लेकिन यह सिर्फ आपको आउटपुट देगा locateजिसमें फ़ाइलनाम पथ हैं। यह काम कर सकता है, हालांकि vim gfसामान्य कमांड का उपयोग करने के बाद कर्सर का मार्ग खुल जाएगा।

संपादित करें

उन स्थानों के साथ फ़ाइलनाम के मामले में आप xargsवर्णित विकल्प या vimऊपर वर्णित समाधान का उपयोग करने से बेहतर हैं । gfकाम करने के लिए नोट करें isfname:

set isfname+=32

यह टिप और विकल्प यहां वर्णित हैं

संपादित करें २

जोड़ा गया उद्धरण और टिप्पणियोंhead में पीटरो द्वारा सुझाए गए अनुसार ।


उनमें व्हाट्सएप के साथ फाइल के लिए, जब मैं फ़ाइल नाम में \ _ डाले, जैसे vi $ (एक और \ फाइल का पता लगाएं)। विम इसे दो अलग-अलग फ़ाइलों के रूप में खोलता है, anotherऔर file:(।
संतोष कुमार

आपका उत्तर केवल तभी काम करता है जब मेरे पास उस फ़ाइल का कोई स्थान नहीं है जिसे मैं खोज रहा हूं।
संतोष कुमार

उत्तर अपडेट किया गया।
थोर

2
@ थोर: एक एकल फ़ाइल के लिए, जैसा कि प्रश्न में उल्लेख किया गया है, आपको बस प्रक्रिया-प्रतिस्थापन के चारों ओर उद्धरण लपेटने की आवश्यकता है: vi "$(locate filename123)"... यह सुनिश्चित करने के लिए कि इससे निपटने के लिए केवल एक फ़ाइल नाम है:vi "$(locate filename123 |head -n1)"
पीटर।

पीटरो: आप सही कह रहे हैं, मैंने केवल कई हिट के साथ परीक्षण किया है। मैंने आपकी टिप्पणियाँ उत्तर में जोड़ दी हैं।
थोर

1

सबसे आसान तरीका है शेल प्रतिस्थापन केlocate रूप में पारित करना , जैसे:

vim $(locate filename123)

आप उदाहरण के लिए, संपादित करने के लिए फ़ाइल नामों को पारित करने के findबजाय उपयोग करने पर विचार कर सकते हैं locate:

find . -name 'filename123' -exec vim {} +

यूनिक्स / ओएसएक्स पर आप पैरामीटर के xargsसाथ उपयोग कर सकते हैं -o, जैसे:

locate filename123 | xargs -o vim

-oआदेश को निष्पादित करने से पहले बच्चे की प्रक्रिया में / देव / tty के रूप में फिर से खोलें। यह उपयोगी है यदि आप xargs को एक इंटरैक्टिव अनुप्रयोग चलाना चाहते हैं।

या लिनक्स पर निम्नलिखित वर्कअराउंड का उपयोग करके देखें:

locate filename123 | xargs -J% sh -c 'vim < /dev/tty $@'

यदि आप विभिन्न आदेशों का उपयोग कर रहे हैं, तो इसे प्राप्त करने के लिए कमांड प्रतिस्थापन का उपयोग करें , जैसे:

vim $(locate filename123)
vim `locate filename123`

वैकल्पिक रूप से बल आवंटन के parallelबजाय GNU का उपयोग करें xargs, उदाहरण के लिए:

locate filename123 | parallel -X --tty vi

नोट: parallelयूनिक्स / OSX पर काम नहीं करेगा क्योंकि इसमें अलग-अलग पैरामीटर हैं और यह tty का समर्थन नहीं करता है।

कई अन्य लोकप्रिय आदेशों के रूप में अच्छी तरह से (जैसे छद्म tty आवंटन प्रदान करता है -tमें ssh), इसलिए मदद के लिए जाँच करें।

अन्य सुझाव यह होगा कि vipe(Vim कमांड पाइप) का उपयोग करें या निम्न सरल स्क्रिप्ट का उपयोग करें:

#!/bin/sh
# usage: locate filename123 | vip
exec vim < /dev/tty "$@"

सम्बंधित:

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.