Pytanie
Używam Bash. Kiedy szukam plików, często wykonuję następujące czynności:
find -name stackexchange.hs
I często wyniki będą wyglądać następująco:
/youre/the/man/now/dog/stackexchange.hs
/you/are/no/longer/the/dog/dog/stackexchange.hs
/this/is/the/file/i/want/stackexchange.hs
Następnie chcę wykonać jedną z następujących czynności:
- Opcja 1: Otwórz ostatni element na liście wyników w vimie .
- Opcja 2: Otwórz n-ty element na liście wyników w vimie .
Obecnie wycinam i wklejam za pomocą myszy. Co prowadzi mnie do mojego pytania :
- Czy istnieje łatwy, jednoliniowy sposób na wykonanie opcji 1 i 2? Zauważ, że to dzieje się po tym
find
poleceniu. - Czy istnieje sposób na uchwycenie linii N ze standardowego wejścia w jakimś wektorze / tablicy bash?
Idealne wykorzystanie
$ find -name am_i_really_all_alone.txt
./borges/library/you_are_not_alone.txt
./borges/library/am_i_really_all_alone.txt
$ vim (N)
(składnia i semantyka mogą się różnić, ale masz rację)
Likeia
Wydaje się, że istnieje kilka podobnych pytań. Oto moje postrzegane różnice (jestem otwarty na oświecenie):
- „Open File Found with find Command” koncentruje się na utworzeniu jednego wiersza, z którego można potokować nazwę pliku
find
dovim
(lub cokolwiek). W moim przypadkufind
najpierw chcę , a później, że tak powiem, potokować. Moje przechwytywanie / użycie odbywa się ściśle później . - „Reuse Last Output From Command Lind” wydaje się uderzające, ale wydaje się po prostu powtarzać polecenie i nie mówi o przechwytywaniu N-tej linii wyniku. Szczerze mówiąc, to mnie przeraża.
- „Capture Multi-Line Output of Bash Builtin” jest blisko, ale nie całkiem.
- „Jaka jest dokładna różnica między terminalem, powłoką, tty, konsolą itp.” ten jest naprawdę po prostu dobrą lekturą.
Dziękuję za pomoc! Korzystając z * nix / BSD, kiedy byłem nastolatkiem w latach 90. i przestraszyłem się, dzwoniąc do mojego wypalonego sąsiada, który pomógł mi zainstalować sterowniki do mojej karty dźwiękowej plug-and-play, z ulgą omawiam polecenia drobiazgi z (zauważalnie) mniej przerażającymi osobami. Dobrze jest wrócić.
źródło
vim $(command |tail -n1)
.Odpowiedzi:
Oto potencjalne rozwiązanie problemu, które powinno być rozsądnie (ale nie całkowicie) bezpieczne w obecności funky nazw plików (nie obsługuje nazw plików z liniami - prawdopodobnie można je naprawić, ale mogą występować inne problemy).
Dwie funkcje, pierwsza działa
find
z przekazanymi parametrami, zapisuje dane wyjściowe w tablicy i wyświetla je. Drugi jest tylko pomocnikiem, aby uzyskać dostęp do tej tablicy.Przypadek użycia:
Cytaty nie są wymagane,
$(myget index)
jeśli w nazwach plików nie ma białych znaków lub innych kłopotliwych znaków.Przesyła całą wydajność
find
do twojego środowiska, która może być ograniczona. (Użycie pliku tymczasowego zamiast tej tablicy rozwiązałoby to, ale występują inne problemy - zwłaszcza równoczesne użycie z wielu powłok).źródło
Mam to w moim
.screenrc
:Zasadniczo na ekranie ¬1wkleja linię nad kursorem ¬2, wkleja drugą linię nad kursorem ... i tak dalej. Możesz chcieć dodać więcej dla linii 10 i wyższych, ale stwierdzam, że po około 7 wolę używać myszy lub
screen
trybu kopiowania, niż licząc liczbę linii, aby uzyskać tę, którą chcę.źródło
innym rozwiązaniem jest: możesz napisać interaktywny skrypt, który automatycznie zapyta o twój wybór. oto kod skryptu interaktywnego:
zapisz ten skrypt pod dowolną nazwą, powiedz „autofind” i wywołaj skrypt za pomocą polecenia „find”, ponieważ argumentem jest kod wywołujący skrypt:
Ale przed użyciem skryptu sprawdź, czy polecenie „find” daje wynik, czy nie. Jeśli pokazuje jakiś wynik, użyj tylko skryptu
źródło
Odpowiedź Matsa była właśnie tym, czego szukałem. Rozszerzyłem nieco jego kod, aby umożliwić więcej opcji get.
.
źródło