Befehl suchen, Ausgabe aufzählen und Auswahl zulassen?

10

Wenn ich benutze find, findet es oft mehrere Ergebnisse wie

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

Ich möchte oft nur ein bestimmtes Ergebnis auswählen (z edit ./projectB/pom.xml. B. ). Gibt es eine Möglichkeit, die findAusgabe aufzulisten und eine Datei auszuwählen, die an eine andere Anwendung übergeben werden soll? mögen:

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

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

?

[Bearbeiten] Ich bin mit einigen der genannten Lösungen auf einige Fehler gestoßen. Daher möchte ich die Schritte zur Reproduktion erläutern:

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>

[Bearbeiten] Lösung 1 Bisher scheint eine Kombination aus 'nl' (Aufzählung), Kopf und Schwanz zu funktionieren, wenn ich sie zu Funktionen kombiniere und $ (!!) verwende.

dh:

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.

[Bearbeiten] Lösung 2 Die Verwendung von "Auswählen" scheint ebenfalls recht gut zu funktionieren. 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
  }
Leo Ufimtsev
quelle
Ist die Your find command | head -TheNumberYouWantErfüllung Ihrer Anforderungen? (Mit Ihrer Linie: !! | head -2 | xargs myEditor)
ADD B
1
Check out fzf , es bindet diese Art von Aktion an ^ T (standardmäßig)
Tavian Barnes

Antworten:

16

Verwenden Sie bashdas integrierte select:

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

Für die im Kommentar hinzugefügte "Bonus" -Frage:

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
quelle
4
+1 für das, was ich vermute, ist ein sehr wenig benutztes Befehlsverb
roaima
Ich arbeite daran. selectscheint nicht gut mit dem Ändern zu platzieren IFS.
DopeGhoti
3
Ah. ( IFS=$'\n'; select file in $(find -maxdepth 2 -name '*.txt'); do echo "$file"; done; )
Roaima
Ich hätte an C-Saiten denken sollen. Gut gemacht!
DopeGhoti
1
Ich würde mich über einen Einblick freuen, @roaima: unix.stackexchange.com/questions/378282/…
DopeGhoti
3

Zwei kleine Funktionen helfen Ihnen dabei, dies zu lösen, vorausgesetzt, Ihre Dateinamen enthalten keine Zeilenumbrüche oder andere nicht druckbare Zeichen. (Es behandelt Dateinamen, die Leerzeichen enthalten.)

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

Beispiel

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

!! | wantnum 2
projectB/pom.xml
Roaima
quelle
Handlich, der explizite Dateiname pom.xmlwird niemals Leerzeichen enthalten (:
DopeGhoti
Es scheint einen Fehler im oben genannten zu geben. find -name pom.xml gibt mir viel Ausgabe, aber findnum gibt mir nur eine einzige Zeile. zB ./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 auf demselben Datensatz, wie haben Sie verwendet findnum?
Roaima
Hoffentlich hilft dieser Screenshot dabei, das Problem zu erklären: i.imgur.com/hfneWJn.png Sie können feststellen , dass feature.xml 3 Ergebnisse liefert. Mit der Findnum-Funktion erhalte ich eine Fehlermeldung. Mit fundnum pom.xml wird nur ein Ergebnis gedruckt, wobei als find -name pom.xml 3 Ergebnisse gedruckt werden. Ich habe meine Frage aktualisiert, um zu erklären, wie ich einen Datensatz erhalte. (Es ist ein einfaches Git Repo)
Leo Ufimtsev
1
@DopeGhoti, obwohl es in einem Verzeichnis mit dem Leerzeichen d sein könnte:
Wildcard
3

Sie könnten den Kopf der Gesamtausgaben erhalten und ihn mit -1 abschließen. Dies kann die Ausgabe in einem anderen Befehl oder Editor weiterleiten, z.

(hol mir 100 Zeilen und drucke mir zuletzt die 100 aus) finde. | Kopf -100 | Schwanz -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)"

erhalten Sie die 100. Linie des Findens.

igiannak
quelle
1
Nun, die einfache Lösung scheint die beste zu sein. Ihre Antwort in Kombination mit 'nl' und '$ (!!)' scheint eigentlich ganz gut zu funktionieren. Ich habe Details in meiner Frage gepostet. Danke für die Antwort.
Leo Ufimtsev
1

Wenn Sie nach einer Suche Dateien bearbeiten möchten, versuchen Sie es mit sag / sack .

Beispiel:

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

... dann das letzte Suchergebnis bearbeiten ....

F 4

Vorteil ist, dass Sie später das erste Suchergebnis mit bearbeiten können

F 1
Fredk
quelle