найти команду, перечислить вывод и разрешить выбор?

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

?

[Edit] Я столкнулся с некоторыми специфическими ошибками с некоторыми из упомянутых решений. Поэтому я хотел бы объяснить шаги для воспроизведения:

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 Использование «выбора», кажется, работает также хорошо. например:

  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 (по умолчанию)
Тавиан Барнс,

Ответы:

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[@]}"
DopeGhoti
источник
4
+1 за предложение того, что я подозреваю, является очень малоиспользуемым командным глаголом
roaima
Я работаю в этом. selectКажется, не очень хорошо с изменением IFS.
DopeGhoti
3
Ах. ( IFS=$'\n'; select file in $(find -maxdepth 2 -name '*.txt'); do echo "$file"; done; )
Ройма
Я должен был подумать о струнах в стиле C Отлично сработано!
DopeGhoti
1
Я был бы признателен за понимание, @roaima: unix.stackexchange.com/questions/378282/…
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
roaima
источник
Удобно, что явное имя файла pom.xmlникогда не будет содержать пробелов (:
DopeGhoti
Кажется, есть некоторые ошибки в выше. 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
Лев Уфимцев
@ Лео в том же наборе данных, как ты использовал findnum?
roaima
Надеемся, что этот снимок экрана поможет объяснить проблему: i.imgur.com/hfneWJn.png Вы можете наблюдать, что файл feature.xml дает 3 результата. с функцией findnum я получаю ошибку. с помощью fundnum pom.xml он печатает только один результат, а команда find -name pom.xml печатает 3 результата. Я обновил свой вопрос, чтобы объяснить, как получить набор данных. (это простой git-репо)
Лев Уфимцев
1
@ DopeGhoti, хотя он может находиться в каталоге с пробелами d:
Подстановочный
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-ю строку поиска.

igiannak
источник
1
Ну, простое решение кажется лучшим. Ваш ответ в сочетании с 'nl' и '$ (!!)', кажется, работает довольно хорошо. Я разместил детали в моем вопросе. Спасибо за ответ.
Лев Уфимцев
1

Если ваша цель - редактировать файлы после поиска, попробуйте sag / sack .

Пример:

$ 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
fredk
источник