मैं उन सभी फ़ाइलों को कैसे खोलूं जो एक ls कमांड का परिणाम हैं?


10

मैं सभी पाठ फ़ाइलों को खोलना चाहता हूं जो एक पाठ संपादक का उपयोग करके एलएस कमांड का परिणाम हैं। मैं यह कैसे करु?

जवाबों:


12

गाइल्स बिल्कुल सही है , lsएक बहुत बुरा उदाहरण है क्योंकि फ़ाइल नाम ग्लोब विस्तार को कमांड लाइन पर बहुत आसान किया जा सकता है बिना उपयोग के ls! यदि आपकी तथाकथित "टेक्स्ट फाइलों" में उन्हें पहचानने के लिए फ़ाइल नाम एक्सटेंशन हैं, तो आप ऐसा कुछ कर सकते हैं:

editor-command *.txt

एक तकनीक का प्रदर्शन करने के लिए, एक अधिक जटिल उदाहरण का उपयोग करने देता है जो केवल फ़ाइल नाम के बजाय सामग्री के आधार पर केवल फ़ाइल नाम मिलान और खुली फ़ाइलों के साथ नहीं किया जा सकता है। कहते हैं कि आप सभी फ़ाइलों को खोलना चाहते थे जिनमें स्ट्रिंग "सामग्री-प्रकार" शामिल था।

मान लें कि आपका संपादक कई फ़ाइल नामों को स्वीकार करेगा और उन सभी को एक साथ अलग-अलग बफ़र्स में खोल देगा या क्रमिक रूप से यह उनके माध्यम से काम करेगा, तो आप बस चला सकते हैं:

editor-command $(grep -i content-type)

अब वापस अपने मूल प्रश्न पर, आपको यह बताने की अनुमति देता है कि क्या वे पाठ फ़ाइलें हैं या उनके नामों पर आधारित नहीं हैं। फिर आपको उन्हें पहचानने के लिए किसी अन्य प्रोग्राम का उपयोग करने की आवश्यकता होगी, फिर उन्हें उस डेटा के आधार पर खोलें। कार्यक्रम fileआपको बताएगा कि किस तरह की फ़ाइल है, और आप उस सूची को केवल पाठ फ़ाइलों के लिए तैयार कर सकते हैं, और फिर इस तरह से मेल खाने वाले फ़ाइल नामों को खोलें:

editor-command $(file -ni * | grep 'text/plain' | cut -d: -f1)

$()निर्माण के अंदर कमांड श्रृंखला के आउटपुट का उपयोग संपादक के लिए तर्क के रूप में किया जाएगा। मैं कभी-कभी दो चरणों में ऐसा करता हूं। कहो कि मैं फाइलों के कुछ सेट के माध्यम से देख रहा हूं और अपने आप को स्ट्रिंग "सामग्री-प्रकार" युक्त प्रत्येक xml फ़ाइल की सूची प्राप्त कर सकता हूं

find -type f -iname '*xml' | xargs grep -Hi 'content-type' |  cut -d: -f1

... और फैसला मैं उन्हें खोलना चाहता हूं। मैं अंतिम कमांड इतिहास शॉर्टकट का उपयोग करता हूं और यह करता हूं:

vim $(!!)

... पिछले कमांड के सभी परिणामों को खोलने के लिए, मेरे पसंदीदा संपादक।

यदि आपका संपादक एक बार में केवल एक फ़ाइल को स्वीकार करेगा और आपको संपादकों को रखने की आवश्यकता है, तो आपको jmtd के उत्तर में xargsया तो forलूप के एक संस्करण का उपयोग करने की आवश्यकता होगी जो इस बात पर निर्भर करता है कि आप टर्मिनल आधारित संपादक का उपयोग कर रहे हैं जिसे stdio की आवश्यकता है।



@ गिल्स: विधिवत रूप से, स्पष्ट रूप से इंगित करने के लिए धन्यवाद कि हम सब नहीं देख पाए। @ c0smikdebris ध्यान दें कि मैं सिर्फ एक मामले सहित मेरे जवाब को पूरी तरह से फिर से लिखता हूं यदि आपके पास मिलान का एक स्पष्ट तरीका नहीं है, जो फाइलें सिर्फ उनके नाम से पाठ हैं।
कालेब

$ () वही है जो मैं वास्तव में ढूंढ रहा था। मुझे यह उल्लेख करना चाहिए कि मैं एक उदाहरण के रूप में ls का उपयोग कर रहा हूँ। दोनों जवाबों के लिए +1।
c0smikdebris

"मेरे पसंदीदा संपादक"। @Caleb को निर्दिष्ट करने की आवश्यकता नहीं है, क्योंकि यह उत्तर की शुरुआत से अधिक या कम स्पष्ट है, आहाहा! अब तक का सबसे अच्छा संपादक!
एनरिको मारिया डे एंजेलिस

4

वर्तमान निर्देशिका में कुछ .txt(यानी *.txt) नामक सभी फाइलों को खोलने के लिए :

$EDITOR *.txt

जहां $EDITORअपने पसंदीदा संपादक, है जैसे gedit *.txt, nano *.txt, vim *.txt, emacs *.txtया जो कुछ भी। *वर्तमान निर्देशिका में सभी फ़ाइलों का मिलान करने के लिए उपयोग करें ।

ध्यान दें कि lsकमांड शामिल नहीं है। lsवास्तव में फ़ाइलों की एक सूची प्रदर्शित करने का काम नहीं है, हालांकि ऐसा तब होता है जब आप इसे किसी निर्देशिका में लागू करते हैं। lsफ़ाइल विशेषताओं (संशोधन समय, अनुमतियाँ, आकार इत्यादि) को प्रदर्शित करने में कहाँ उपयोगी है। कुछ वाइल्डकार्ड पैटर्न से मेल खाती फाइलों के एक समूह पर कुछ करने के लिए, शेल के ग्लब्स पर्याप्त हैं।

उन्नत पर्याप्त संपादक आपको अंदर से ऐसा करने देते हैं। उदाहरण के लिए, Emacs में, बस सामान्य फ़ाइल ओपनिंग कमांड ( C-x C-f) का उपयोग करें और दर्ज करें *.txt

अगर आप भी zsh या bash you4 में उपनिर्देशिकाओं में फाइलों का मिलान करना चाहते हैं, तो आप उपयोग कर सकते हैं $EDITOR **/*.txt


यह वास्तव में संपादक-विशिष्ट है। इस बात की कोई गारंटी नहीं है कि सभी संपादक अपने सभी निशुल्क कमांड-लाइन तर्कों को फ़ाइलों के रूप में मानेंगे, न ही एक समय में एक से अधिक फ़ाइल खोलने का समर्थन करेंगे।
jmtd

2

यह आपके टेक्स्ट एडिटर की कुछ बारीकियों पर निर्भर करता है। उन्नत संपादक संभवतः एक उदाहरण में कमांड लाइन से कई फाइलें खोलने का काम कर सकते हैं। लेकिन उदाहरण के लिए, यह कहें कि आपका संपादक (नीचे मेरे उदाहरण में $ EDITOR) केवल एक समय में एक ही खोल सकता है। आप पाइप के लिए एक उपयुक्त का उत्पादन करना चाहिए findमें xargs। यह भी $ EDITOR TTY पर नहीं ले रहा है (इसलिए, चित्रमय का उपयोग करके) पर निर्भर करता है

find . -maxdepth 1 -type f -name '*.c' -print0 | xargs -r0n 1 $EDITOR

यदि आप एक कंसोल एडिटर का उपयोग करना चाहते हैं, तो एक शेल लूप अधिक उपयुक्त हो सकता है, लेकिन यदि आप कई असामान्य फ़ाइलनामों के लिए विफल हो जाएंगे (व्हाट्सएप वर्णों और विभिन्न अन्य चीजों को ढहाने या प्रतिस्थापित करके):

for i in *.c; do $EDITOR "$i"; done

2
Ls के आउटपुट को पार्स न करें! का प्रयोग करें $EDITOR *.cया for i in *.c; do $EDITOR "$i"; done
गिल्स एसओ- बुराई को रोकना '

अच्छी पकड़ - उचित रूप से संपादित।
jmtd

ध्यान दें कि forव्हाट्सएप वर्णों के ढहने / बदलने सहित कई फ़ाइलनामों के लिए मामला विफल हो जाएगा।
jmtd

के रूप में यह अब लिखा है, forमामले हर फ़ाइल नाम के साथ (संभवतः नाम के साथ शुरुआत को छोड़कर काम करेंगे -या +कुछ संपादकों के साथ; for i in ./*.cकि ठीक होगा)।
गिल्स एसओ- बुराई को रोकें '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.