find command, enumerate output and allow selection?
Use bash
's built-in select
:
IFS=$'\n'; select file in $(find -type f -name pom.xml); do
$EDITOR "$file"
break
done; unset IFS
For the "bonus" question added in the comment:
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[@]}"
Two little functions will help you solve this provided your filenames don't contain newlines or other non-printing characters. (It does handle filenames that contain spaces.)
findnum() { find "$@" | sed 's!^\./!!' | nl; }
wantnum() { sed -nr "$1"'{s/^\s+'"$1"'\t//p;q}'; }
Example
findnum -name pom.xml
1 projectA/pom.xml
2 projectB/pom.xml
3 projectC/pom.xml
!! | wantnum 2
projectB/pom.xml
you could get the head of the total outputs and tail it with -1. this can pipe the output in any other command or editor eg.
(get me 100 lines and print me at last pipe the 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)"
will get you the 100th line of finding.