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


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.