मैं लिनक्स में vi में खोजकर लौटी सभी फाइलों को कैसे संपादित कर सकता हूं?


27

जो कुछ मैं अपने आप को बहुत कुछ करता हुआ पा रहा हूँ वह एक खोज कमांड चला रहा है और फिर उन सभी को vi में संपादित कर रहा है, जो कुछ इस तरह दिखता है:

> find . "*.txt"
./file1.txt
./file2.txt
./path/to/file3.txt

> vi ./file1.txt ./file2.txt ./path/to/file3.txt

क्या यह सब एक कमांड लाइन में करने का एक चतुर और सरल तरीका है?


1
आप इसे vi: find में पाइप कर सकते हैं। * ".txt" | xargs vi
MaQleod

1
@MaQleod: तकनीकी रूप से यह xargs के लिए पाइपिंग होगा ।
ग्रैविटी


पाइपिंग xargsने मेरे शेल टर्मिनल को नष्ट कर दिया। उचित समाधान @DevSolar
टाइपेलोगिक

जवाबों:


41

यह काम कर जाना चाहिए:

find . -name "*.txt" -exec vim {} + 

विम का उपयोग करें, यह आपके स्वास्थ्य के लिए बेहतर है। :-)

सभी फ़ाइलनाम (लाइन की सीमा सीमा तक) बनाने के लिए thet-overlooked +विकल्प -execएक पंक्ति में दिखाई देता है, यानी आपको अभी भी सभी फाइलें एक vim सत्र में खोली जाती हैं ( :nअगले और :Nपिछले फ़ाइल के लिए नेविगेट की जाती हैं )।

आपके साथ vim -pप्रत्येक फ़ाइल के लिए एक फ़ाइल टैब मिलता है। :help tab-page-commandsअधिक जानकारी के लिए जाँच करें ।

आपके साथ vim -oप्रत्येक फ़ाइल के लिए क्षैतिज रूप से विभाजित खिड़कियां मिलेंगी, vim -Oऊर्ध्वाधर रूप से विभाजित खिड़कियां। :help window-move-cursorअधिक जानकारी के लिए जाँच करें ।

ध्यान दें कि इस उत्तर का पिछला संस्करण vim $(find . -name "*.txt"), फ़ाइल नाम में रिक्त स्थान के साथ काम नहीं करता है, और इसके सुरक्षा निहितार्थ हैं।

पाइपिंग में xargs viएक Warning: Input is not from a terminal, प्लस पूरी तरह से फर्जी व्यवहार के साथ एक टर्मिनल देता है । नीचे दिए गए एक टिप्पणी में और इस प्रश्न में थोड़ा और स्पष्टीकरण के साथ उपयोगकर्ता की गंभीरता क्यों बताई गई है ।


4
पता नहीं आप विम के बारे में कितना जानते हैं, लेकिन मुझे यह पता लगाने के लिए / हमेशा के लिए / लिया गया: n अगली फ़ाइल दिखाता है और: N पिछले एक को दिखाता है।
zpletan

4
@DevSolar: Vim को इसकी स्टैनिंग को अपने नियंत्रण टर्मिनल के समान होने की उम्मीद है, और सीधे स्टड पर विभिन्न टर्मिनल-संबंधित ioctls करता है। (आप इसे एक बग पर विचार कर सकते हैं । विम निश्चित रूप से /dev/ttyउस पर ioctl () को खोल और कॉल कर सकते हैं ; यह बस ऐसा करने के लिए बहुत लंबा है।) जब xargs द्वारा आमंत्रित किया जाता है, तो विम को /dev/nullइसके मानक इनपुट के रूप में प्राप्त होता है , जो टर्मिनल-कंट्रोल -ioctls को अनदेखा करता है।
ग्रैविटी

3
@zpletan: vim -pयदि आप फ़ाइल टैब चाहते हैं। ( gtऔर gTनेविगेट करने के लिए, या अपने माउस से क्लिक करें।)
ग्रेविटी

2
FYI करें, जब पाइपिंग में चेतावनी से बचने के लिए vim, बस -पहले तर्क के रूप में निर्दिष्ट करें echo foobar | vim -
कोनराड रुडोल्फ

2
@ कोनराड रुडोल्फ: find . -name "*.txt" | vim -आपको एक अनाम फ़ाइल पर एक विम सेशन मिलता है , जिसमें मिली हुई फाइलों के नाम होते हैं, जो कि ओपी ने नहीं मांगी ...
DevSolar


1

इसके अतिरिक्त, यदि आप चाहते हैं कि वे एक समय में एक को खोला जाए, तो आप फाइंड -एक्सईसी का भी उपयोग कर सकते हैं या लूप के लिए एक सरल का उपयोग कर सकते हैं। प्रति टिप्पणी का संपादन किया।

find . -name "*.txt" -exec vi {} \;

या

OLDIFS=$IFS
IFS=$(echo -en "\n\b")
for i in `find . -name "*.txt"`
    do
        vi $i
    done
IFS=$OLDIFS

... लेकिन आप ऐसा क्यों करना चाहेंगे?
DevSolar

@DevSolar पहली क्षमता को खोजने की क्षमता है, दूसरा एक सामान्य उद्देश्य लूप है। शायद आप इसे संपादित करने से पहले हर फ़ाइल के लिए कुछ करना चाहते हैं।
ओल्डवुल्फ

क्या आपने कभी दूसरा प्रयास किया है? पहला: खोज वर्तमान निर्देशिका को लौटाता है क्योंकि -nameगायब है। और दूसरा: जैसे ही फ़ाइल नाम में कोई स्पेस होता है कमांड बुरी तरह से फेल हो जाता है। -1 अनिर्णीत उत्तर के लिए।
ceving

दरअसल, फ़ाइलनामों में रिक्त स्थान का विषय मेरे उत्तर पर भी लागू होता है। मैं इसे कमांड लाइन से अपनी खुद की थोड़ी स्क्रिप्ट में बदलने के बिना उन्हें ठीक से संभालने का तरीका भी नहीं सोच सकता। एक अच्छा कारण है कि फाइलनाम में रिक्त स्थान को हतोत्साहित किया जाता है।
DevSolar

@ceving एक मान्य बिंदु। मुझे लगता है कि मूल पोस्टर उनकी जरूरतों के लिए मान्य थे। संपादन।
ओल्डवुल्फ

0

यदि आपने पहले ही अपना findआदेश टाइप कर लिया है तो मुझे लगता है कि xargsखोज परिणामों को खोलने के लिए उपयोग करना बहुत आसान हो सकता है :

find . -name "*.txt" | xargs vim -p

-pविकल्प vim बताता है एक नए टैब में प्रत्येक फ़ाइल खोलने के लिए। मुझे यह सिर्फ बफ़र्स का उपयोग करने की तुलना में अधिक सुविधाजनक लगता है, लेकिन यदि आप नहीं तो बस उस विकल्प को छोड़ दें।


धन्यवाद, मैंने इसे अपने कमांड का पता लगाने के लिए जोड़ा था: फ़ाइल नाम का पता लगाएं | xargs vim -p
talsibony

0

सभी को संपादित करने के लिए *.txt, आप बस चला सकते हैं vim *.txt:। द्वारा लौटाई गई फ़ाइलों को संपादित करने के लिए find, फ़्यूचर पढ़ें।


यूनिक्स / मैकओएस पर, आप findबीएसडी xargs(देखें :) man xargs, जैसे के साथ उपयोग कर सकते हैं

find -L . -name "*.txt" -type f -print0 | xargs -o -0 vim

-o( xargs): आदेश को निष्पादित करने से पहले बच्चे की प्रक्रिया में / देव / टटी के रूप में फिर से खोलना।

संबंधित: टर्मिनल विम के xargs के साथ विम का आह्वान करने के बाद बोर्क किया गया।

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