कमांड खोजें, आउटपुट को बढ़ाएँ और चयन की अनुमति दें?


10

जब मैं उपयोग करता हूं find, तो यह अक्सर कई तरह के परिणाम पाता है

find -name pom.xml
./projectA/pom.xml
./projectB/pom.xml
./projectC/pom.xml

मैं अक्सर केवल एक विशिष्ट परिणाम का चयन करना चाहता हूं, (उदाहरण के लिए edit ./projectB/pom.xml)। क्या findआउटपुट को एन्यूमरेट करने और किसी अन्य एप्लिकेशन में पास होने के लिए फ़ाइल का चयन करने का कोई तरीका है ? पसंद:

find <print line nums?> -name pom.xml
1 ./projectA/pom.xml
2 ./projectB/pom.xml
3 ./projectC/pom.xml

!! | <get 2nd entry> | xargs myEditor

?

[संपादित करें] मैं उल्लिखित कुछ समाधानों के साथ कुछ पेर्कुलियर बग में टकरा गया हूं। इसलिए मैं पुन: पेश करने के लिए चरणों की व्याख्या करना चाहूंगा:

git clone http://git.eclipse.org/gitroot/platform/eclipse.platform.swt.git
cd eclipse.platform.swt.git
<now try looking for 'pom.xml' and 'feature.xml' files>

[संपादित करें] समाधान 1 अब तक 'nl' (एन्यूमरेट आउटपुट), हेड और टेल का एक संयोजन काम करता है यदि मैं उन्हें कार्यों में संयोजित करता हूं और $ (!!) का उपयोग करता हूं।

अर्थात:

find -name pom.xml | nl   #look for files, enumirate output.

#I then define a function called "nls"
nls () {
  head -n $1 | tail -n 1
}

# I then type: (suppose I want to select item #2)
<my command> $(!!s 2)

# I press enter, it expands like: (suppose my command is vim)
vim $(find -name pom.xml |nls 2)

# bang, file #2 opens in vim and Bob's your uncle.

[संपादित करें] समाधान 2 "चयन" का उपयोग करने के साथ-साथ काफी अच्छी तरह से काम करता है। उदाहरण के लिए:

  findexec () {
          # Usage: findexec <cmd> <name/pattern>
          # ex: findexec vim pom.xml
          IFS=$'\n'; 
          select file in $(find -type f -name "$2"); do
                  #$EDITOR "$file"
                  "$1" "$file"
                  break
          done;  
          unset IFS
  }

है Your find command | head -TheNumberYouWantअपनी आवश्यकताओं को पूरा करने? (अपनी लाइन के साथ: !! | head -2 | xargs myEditor)
— ADDB

1
की जाँच करें fzf , यह करने के लिए कार्रवाई के इस प्रकार बांधता ^ टी (डिफ़ॉल्ट रूप से)
— Tavian बार्न्स

जवाबों:


16

उपयोग में bashनिर्मित select:

IFS=$'\n'; select file in $(find -type f -name pom.xml); do
  $EDITOR "$file"
  break
done; unset IFS

टिप्पणी में जोड़ा गया "बोनस" प्रश्न के लिए:

declare -a manifest
IFS=$'\n'; select file in $(find -type f -name pom.xml) __QUIT__; do
  if [[ "$file" == "__QUIT__" ]]; then
     break;
  else
     manifest+=("$file")
  fi
done; unset IFS
for file in ${manifest[@]}; do
    $EDITOR "$file"
done
# This for loop can, if $EDITOR == vim, be replaced with 
# $EDITOR -p "${manifest[@]}"

4
+1 जो मुझे संदेह है उसे प्रस्तुत करने के लिए एक बहुत ही कम इस्तेमाल की जाने वाली कमांड क्रिया है
— रोइमा

मैं इसमें काम कर रहा हूं। selectबदलने के साथ अच्छी तरह से जगह नहीं लगती है IFS।
— डोपघोटी

3
आह। ( IFS=$'\n'; select file in $(find -maxdepth 2 -name '*.txt'); do echo "$file"; done; )
— रोआमा

मुझे सी-स्टाइल स्ट्रिंग्स के बारे में सोचना चाहिए था। बहुत बढ़िया!
— डोपघोटी

1
मैं कुछ अंतर्दृष्टि की सराहना करता हूं, @roaima: unix.stackexchange.com/questions/378282/…
— DopeGhoti

3

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

findnum() { find "$@" | sed 's!^\./!!' | nl; }
wantnum() { sed -nr "$1"'{s/^\s+'"$1"'\t//p;q}'; }

उदाहरण

findnum -name pom.xml
     1  projectA/pom.xml
     2  projectB/pom.xml
     3  projectC/pom.xml

!! | wantnum 2
projectB/pom.xml

स्पष्ट रूप से, स्पष्ट फ़ाइल नाम pom.xmlमें कभी
— व्हाट्सएप

ऊपर कुछ बग दिख रहा है। find -name pom.xml मुझे बहुत आउटपुट देगा, लेकिन फाइंडनम मुझे केवल एक लाइन देता है। जैसे ./features/org.eclipse.swt.tools.feature/pom.xml//examples/org.eclipse.swt.examples.ole.win32/pom.xml ./examples/org.eclipse.swt.examples/pom। .xml ./examples/org.eclipse.swt.examples.views/pom.xml ./examples/org.eclipse.swt.examples.launcher/pom.xml ./examples/org.eclipse.swt.examples.browser। demos / pom.xml ./local-build/local-build-parent/pom.xml
— लियो

@ उसी डेटासेट पर, आपने कैसे उपयोग किया findnum?
— रोएमा

उम्मीद है कि यह स्क्रीन शॉट इस मुद्दे को समझाने में मदद करता है: i.imgur.com/hfneWJn.png आप उस सुविधा को देख सकते हैं। xml 3 परिणाम देता है। फाइंडनम फीचर के साथ मुझे एक त्रुटि मिलती है। Fundnum pom.xml के साथ यह केवल एक परिणाम प्रिंट करता है, जहाँ ढूँढें -name pom.xml 3 परिणाम प्रिंट करता है। मैंने अपना सवाल अपडेट किया कि कैसे डेटासेट प्राप्त किया जाए। (यह एक साधारण git रेपो है)
— Leo Ufimtsev

1
@ डोपघोटी, हालांकि यह एक निर्देशिका में हो सकता है जिसका नाम व्हॉट्सएप डी है:
— वाइल्डकार्ड

3

आप कुल आउटपुट का सिर प्राप्त कर सकते हैं और इसे -1 से जोड़ सकते हैं। यह किसी भी अन्य कमांड या एडिटर जैसे आउटपुट को पाइप कर सकता है।

(मुझे 100 लाइनें मिलें और मुझे आखिरी पाइप 100 पर प्रिंट करें) खोजें। | सिर -100 | पूंछ -1

xxx@prod01 (/home/xxx/.ssh) $ find .
.
./authorized_keys
./id_rsa
./id_rsa.pub
./id_rsa_b_x.pub
./id_rsa_a_y.pub
./known_hosts

xxx@prod01 (/home/xxx/.ssh) $ find . | head -3
.
./authorized_key
./id_rsa

xxx@prod01 (/home/xxx/.ssh) $ find . | head -3 | tail -1
./id_rsa    



eg: vim "$(find . | head -100 | tail -1)"

आपको खोजने की 100 वीं पंक्ति मिलेगी।


1
वैसे, सरल समाधान सबसे अच्छा लगता है। आपका उत्तर 'nl' और '$ (!!)' के साथ संयुक्त रूप से काफी अच्छी तरह से काम करता है। मैंने अपने प्रश्न में विवरण पोस्ट किया। प्रतिक्रिया के लिए धन्यवाद।
— सिंह उफिम्त्सेव

1

यदि आपका लक्ष्य खोज के बाद फ़ाइलों को संपादित करना है, तो sag / sack का प्रयास करें ।

उदाहरण:

$ sag skb_copy                                                                
sack__option is: -ag

============> running ag! <============

===> Current Profile: no_profile
===> Using flags: 
===> Searching under: /home/fklassen/git/pvc-appliance/kernel/drivers/ixgbevf
===> Searching parameters: skb_copy


/home/fklassen/git/pvc-appliance/kernel/drivers/ixgbevf/kcompat.c
[1] 195:        skb_copy_bits(skb, offset, buffer, len) < 0)

/home/fklassen/git/pvc-appliance/kernel/drivers/ixgbevf/kcompat.h
[2] 1774:   if (skb_copy_bits(skb, offset, buffer, len) < 0)
[3] 2321:#define skb_copy_to_linear_data(skb, from, len) \
[4] 2323:#define skb_copy_to_linear_data_offset(skb, offset, from, len) \

... तो अंतिम खोज परिणाम संपादित करने के लिए ...।

F 4

लाभ यह है कि आप बाद में पहले खोज परिणाम को संपादित कर वापस जा सकते हैं

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