내가 그것을 사용하면 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"(열거 출력), 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
}
답변1
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[@]}"
답변2
파일 이름에 줄 바꿈이나 기타 인쇄할 수 없는 문자가 포함되어 있지 않으면 두 가지 작은 함수가 이 문제를 해결하는 데 도움이 될 것입니다. (공백이 포함된 파일 이름을 처리합니다.)
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
답변3
총 출력의 앞부분을 가져와 -1로 끝낼 수 있습니다. 이는 다른 명령이나 편집기에서 출력되도록 파이프될 수 있습니다.
(나에게 100줄을 주고 마지막에 인쇄되도록 파이프하십시오) find |head-100|tail-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번째 줄을 찾아드립니다.
답변4
검색 후 파일을 편집하는 것이 목표라면 다음을 시도해 보세요.늘어짐/자루.
예:
$ 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