tìm lệnh, liệt kê đầu ra và cho phép lựa chọn?


10

Khi tôi sử dụng find, nó thường tìm thấy nhiều kết quả như

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

Tôi thường chỉ muốn chọn một kết quả cụ thể, (ví dụ edit ./projectB/pom.xml). Có cách nào để liệt kê findđầu ra và chọn một tệp để chuyển sang ứng dụng khác không? giống:

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

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

?

[Chỉnh sửa] Tôi đã va vào một số lỗi perculiar với một số giải pháp được đề cập. Vì vậy, tôi muốn giải thích các bước để sao chép:

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>

[Chỉnh sửa] Giải pháp 1 Cho đến nay, sự kết hợp của 'nl' (đầu ra enumirate), head & tail dường như hoạt động nếu tôi kết hợp chúng thành các hàm và sử dụng $ (!!).

I E:

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.

[Chỉnh sửa] Giải pháp 2 Sử dụng "chọn" dường như cũng hoạt động khá tốt. Ví dụ:

  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đáp ứng yêu cầu của bạn? (Với dòng của bạn !! | head -2 | xargs myEditor:)
ADDB

1
Hãy xem fzf , nó liên kết loại hành động này với ^ T (theo mặc định)
Tavian Barnes

Câu trả lời:


16

Sử dụng tích bashhợp sẵn select:

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

Đối với câu hỏi "tiền thưởng" được thêm vào trong bình luận:

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 để cung cấp những gì tôi nghi ngờ là một động từ lệnh được sử dụng rất ít
roaima

Tôi đang làm việc trong đó. selectdường như không đặt độc đáo với sự thay đổi IFS.
DopeGhoti

3
Ah. ( IFS=$'\n'; select file in $(find -maxdepth 2 -name '*.txt'); do echo "$file"; done; )
roaima

Tôi nên nghĩ về chuỗi kiểu C. Làm tốt!
DopeGhoti

1
Tôi đánh giá cao một số thông tin chi tiết, @roaima: unix.stackexchange.com/questions/378282/ Kẻ
DopeGhoti

3

Hai chức năng nhỏ sẽ giúp bạn giải quyết điều này với điều kiện tên tệp của bạn không chứa dòng mới hoặc các ký tự không in khác. (Nó xử lý tên tệp có chứa khoảng trắng.)

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

Thí dụ

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

!! | wantnum 2
projectB/pom.xml

Handily, tên tệp rõ ràng pom.xmlsẽ không bao giờ chứa khoảng trắng (:
DopeGhoti

Dường như có một số lỗi ở trên. find -name pom.xml sẽ cho tôi rất nhiều đầu ra, nhưng findnum chỉ cung cấp cho tôi một dòng duy nhất. ví dụ: ./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.view/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
Leo Ufimtsev

@Leo trên cùng một tập dữ liệu bạn đã sử dụng findnumnhư thế nào?
roaima

Hy vọng rằng ảnh chụp màn hình này sẽ giúp giải thích vấn đề: i.imgur.com/hfneWJn.png Bạn có thể quan sát rằng Feature.xml mang lại 3 kết quả. với tính năng findnum tôi gặp lỗi. với fundnum pom.xml, nó chỉ in một kết quả trong đó như find -name pom.xml in 3 kết quả. Tôi cập nhật câu hỏi của tôi để giải thích làm thế nào để có được dữ liệu. (đó là một repo đơn giản)
Leo Ufimtsev

1
@DopeGhoti, mặc dù nó có thể nằm trong một thư mục có tên khoảng trắng d:
Wildcard

3

bạn có thể lấy đầu của tổng đầu ra và nối đuôi với -1. điều này có thể dẫn đầu ra trong bất kỳ lệnh hoặc trình soạn thảo nào khác, vd.

(lấy cho tôi 100 dòng và in cho tôi ở ống cuối cùng 100) tìm. | đầu -100 | đuôi -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)"

sẽ giúp bạn có dòng thứ 100 tìm kiếm.


1
Vâng, giải pháp đơn giản dường như là tốt nhất. Câu trả lời của bạn kết hợp với 'nl' và '$ (!!)' dường như hoạt động khá tốt trên thực tế. Tôi đã đăng chi tiết trong câu hỏi của tôi. Cảm ơn cho phản ứng.
Leo Ufimtsev

1

Nếu mục tiêu của bạn là chỉnh sửa các tệp sau khi tìm kiếm, hãy thử sag / sack .

Thí dụ:

$ 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) \

... Sau đó để chỉnh sửa kết quả tìm kiếm cuối cùng ....

F 4

Ưu điểm là bạn có thể quay lại sau chỉnh sửa kết quả tìm kiếm đầu tiên với

F 1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.