কমান্ড সন্ধান, আউটপুট গণনা এবং নির্বাচনের অনুমতি?


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 এখনও অবধি 'এনএল' (গণ্য আউটপুট), মাথা এবং লেজগুলির সংমিশ্রণটি কাজ করে মনে হচ্ছে যদি আমি তাদের ফাংশনগুলিতে একত্রিত করি এবং $ (!!) ব্যবহার করি।

অর্থাৎ,

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:)
এডিডিবি

1
Fzf দেখুন , এটি এই ধরণের ক্রিয়াকে ^ T (ডিফল্টরূপে) সাথে আবদ্ধ করে তোলে
তাভিয়ান বার্নস

উত্তর:


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
আমি কিছু অন্তর্দৃষ্টি প্রশংসা করব, @ রোয়াইমা: unix.stackexchange.com/questions/378282/…
ডোপঘোটি

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

Handily, স্পষ্ট ফাইলের নাম pom.xmlহোয়াইটস্পেস (ধারণ করবে না:
DopeGhoti

উপরের দিক থেকে কিছু বাগ রয়েছে বলে মনে হচ্ছে। Find -name pom.xML আমাকে প্রচুর আউটপুট দেবে, তবে ফাইন্যাম আমাকে কেবল একটি লাইন দেয়। উদাহরণস্বরূপ ./features/org.eclipse.swt.tools.feature/pom.xml ./example/org.eclipse.swt.exferences.ole.win32/pom.xml ./exferences/org.eclipse.swt.exferences/pom .xml ./example/org.eclipse.swt.example.views/pom.xml ./example/org.eclipse.swt.exferences.launcher/pom.xml ./exferences/org.eclipse.swt.exferences.browser। Demos / pom.xML ./local-build/local-build-parent/pom.xML
লিও

@ একই ডেটাসেটে লিয়ো আপনি কীভাবে ব্যবহার করেছেন findnum?
রোয়াইমা

আশা করি এই স্ক্রিন শটটি সমস্যাটি ব্যাখ্যা করতে সহায়তা করবে: i.imgur.com/hfneWJn.png আপনি পর্যবেক্ষণ করতে পারেন বৈশিষ্ট্যটি। Xml 3 ফলাফল দেয়। সন্ধানী বৈশিষ্ট্য সহ আমি একটি ত্রুটি পাই। ফান্ডনাম pom.xML এর সাহায্যে এটি কেবলমাত্র একটি ফলাফল মুদ্রণ করে যেখানে সন্ধানের নাম হিসাবে pom.xML 3 ফলাফল মুদ্রণ করে। ডেটাসেট কীভাবে পাবেন তা বোঝাতে আমি আমার প্রশ্ন আপডেট করেছি। (এটি একটি সাধারণ গিট রেপো)
লিও উফিম্টসেভ

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
ঠিক আছে, সহজ সমাধানটি সেরা বলে মনে হচ্ছে। আপনার উত্তর 'এনএল' এবং '$ (!!)' এর সাথে মিলিত হয়ে বাস্তবে বেশ ভালভাবে কাজ করছে বলে মনে হচ্ছে। আমি আমার প্রশ্নের বিবরণ পোস্ট করেছি। প্রতিক্রিয়া জন্য ধন্যবাদ।
লিও উফিম্টসেভ

1

যদি আপনার লক্ষ্য কোনও অনুসন্ধানের পরে ফাইলগুলি সম্পাদনা করা হয় তবে স্যাগ / ব্যাগ চেষ্টা করুন ।

উদাহরণ:

$ 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.