trovare il comando, enumerare l'output e consentire la selezione?


10

Quando uso find, spesso trova più risultati simili

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

Spesso desidero selezionare solo un risultato specifico (ad es edit ./projectB/pom.xml.). C'è un modo per enumerare l' findoutput e selezionare un file da passare a un'altra applicazione? piace:

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

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

?

[Modifica] Mi sono imbattuto in alcuni bug percolari con alcune delle soluzioni menzionate. Quindi vorrei spiegare i passaggi per riprodurre:

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>

[Modifica] Soluzione 1 Finora una combinazione di 'nl' (output enumirato), head & tail sembra funzionare se li combino in funzioni e uso $ (!!).

vale a dire:

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.

[Modifica] Soluzione 2 L' uso di "seleziona" sembra funzionare altrettanto bene. ex:

  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 -TheNumberYouWantsoddisfare le vostre esigenze? (Con la vostra linea: !! | head -2 | xargs myEditor)
ADDB

1
Dai un'occhiata a FZF , lega questo tipo di azione a ^ T (per impostazione predefinita)
Tavian Barnes,

Risposte:


16

Usa bashil built-in select:

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

Per la domanda "bonus" aggiunta nel commento:

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 per offrire quello che sospetto è un verbo di comando molto poco usato
roaima,

Ci sto lavorando. selectnon sembra andare bene con l'alterazione IFS.
DopeGhoti,

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

Avrei dovuto pensare alle corde in stile C. Molto bene!
DopeGhoti,

1
Apprezzerei alcune intuizioni, @roaima: unix.stackexchange.com/questions/378282/…
DopeGhoti

3

Due piccole funzioni ti aiuteranno a risolverlo, a condizione che i nomi dei file non contengano righe o altri caratteri non stampabili. (Gestisce nomi di file che contengono spazi.)

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

Esempio

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

!! | wantnum 2
projectB/pom.xml

Praticamente, il nome file esplicito pom.xmlnon conterrà mai spazi bianchi (:
DopeGhoti

Sembra che ci sia qualche bug nel precedente. find -name pom.xml mi darà molto output, ma findnum mi dà solo una riga. ad esempio ./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 su quello stesso set di dati come hai usato findnum?
roaima,

Speriamo che questa schermata aiuti a spiegare il problema: i.imgur.com/hfneWJn.png È possibile osservare che feature.xml produce 3 risultati. con la funzione findnum ricevo un errore. con fundnum pom.xml stampa solo un risultato dove come find-name pom.xml stampa 3 risultati. Ho aggiornato la mia domanda per spiegare come ottenere il set di dati. (è un semplice repository git)
Leo Ufimtsev,

1
@DopeGhoti, anche se potrebbe trovarsi in una directory denominata con spazi bianchi d:
Wildcard

3

potresti ottenere la testa degli output totali e adattarla con -1. questo può reindirizzare l'output in qualsiasi altro comando o editor, ad es.

(prendimi 100 righe e stampami alla fine la 100) trova. | testa -100 | coda -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)"

ti porterà alla centesima linea di ricerca.


1
Bene, la soluzione semplice sembra essere la migliore. La tua risposta combinata con 'nl' e '$ (!!)' sembra funzionare abbastanza bene in realtà. Ho pubblicato i dettagli nella mia domanda. Grazie per la risposta
Leo Ufimtsev,

1

Se il tuo obiettivo è modificare i file dopo una ricerca, prova l' abbassamento / sacco .

Esempio:

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

... quindi per modificare l'ultimo risultato della ricerca ....

F 4

Il vantaggio è che puoi tornare più tardi modificando il primo risultato di ricerca con

F 1
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.