명령 찾기, 출력 열거 및 선택 허용?


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'(enumirate output)의 조합으로 head & tail은 함수로 결합하고 $ (!!)를 사용하면 작동하는 것 같습니다.

즉 :

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 "select"를 사용하면 꽤 잘 작동하는 것 같습니다. 전의:

  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를 확인하면 이런 종류의 동작을 ^ T (기본적으로)에 바인딩합니다
Tavian Barnes

답변:


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
roaima

나는 그것에 노력하고 있습니다. select변경으로 멋지게 배치되지 않는 것 같습니다 IFS.
DopeGhoti

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

C 스타일 문자열을 생각해야했습니다. 잘 했어!
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


위의 버그가있는 것 같습니다. find -name pom.xml은 많은 출력을 제공하지만 findnum은 한 줄만 제공합니다. 예 : ./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
Leo Ufimtsev

동일한 데이터 세트에서 @Leo 어떻게 사용 findnum했습니까?
roaima

이 스크린 샷은 문제를 설명하는 데 도움이 되기를 바랍니다 . i.imgur.com/hfneWJn.png feature.xml이 3 개의 결과를 생성한다는 것을 알 수 있습니다. findnum 기능으로 오류가 발생합니다. fundnum pom.xml을 사용하면 find -name pom.xml이 3 개의 결과를 인쇄하는 결과 하나만 인쇄합니다. 데이터 세트를 얻는 방법을 설명하기 위해 질문을 업데이트했습니다. (간단한 git repo입니다)
Leo Ufimtsev

1
@DopeGhoti, 공백 d로 이름이 지정된 디렉토리에 있을 수 있지만
Wildcard

3

총 출력의 헤드를 가져 와서 -1로 테일 할 수 있습니다. 이것은 다른 명령이나 편집기에서 출력을 파이프 할 수 있습니다.

(100 줄을 가져 와서 마지막 파이프 100에서 인쇄하십시오) find. | 머리 -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'과 '$ (!!)'와 함께 실제로 잘 작동하는 것 같습니다. 내 질문에 세부 사항을 게시했습니다. 답변 주셔서 감사합니다.
레오 Ufimtsev

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.