Jak „zlokalizować” wiele plików i otworzyć je w vimie?

10

Załóżmy, że mam plik o nazwie filename123.txti to jest tak nazwany pojedynczy plik, i mogę to locatezrobić za pomocą polecenia locate filename123. I zwraca tylko ten plik.

Teraz chcę go otworzyć za pomocą vi/ vim. Ale nie chcę iść w to miejsce i wpisać vipolecenia, a następnie nazwy pliku. Tutaj chcę, aby wynik locate filename123był dołączony do polecenia vi. Jak mogę to zrobić? Próbowałem już:

locate filename123 | vi

Ale to nie działa. Ten błąd pojawia się w terminalu:

santosh@santosh:~$ locate filename123 | vi
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: Finished.
Santosh Kumar
źródło

Odpowiedzi:

12

Możesz użyć xargs:

locate filename123 | xargs vi

Domyślnie xargswykona jak najmniej instancji określonej komendy, przekazując jak najwięcej parametrów zgodnie z ARG_MAX systemu . Aby ograniczyć liczbę parametrów przekazywanych do wystąpienia vi, użyj opcji xargs-n.

Aby obsługiwać nazwy plików zawierające spacje, użyj opcji xargs-d:

locate filename123 | xargs -d '\n' vi

Aby obsłużyć nazw plików zawierających znaki nowej linii używają xargs-0opcji razem z locate” s -0opcja:

locate -0 filename123 | xargs -0 vi

(Jeśli -0nie jest dostępny na żadnym z nich, sprawdź --nullteż, lub inny sposób określenia znaku \000jako separatora).

człowiek w pracy
źródło
Czy możesz mi powiedzieć, co uniemożliwiało mi otwarcie tego pliku?
Santosh Kumar,
1
@Santosh Przekazałeś wyjście locatepolecenia jako dane wejściowe do vi. Vi, jak każdy inny program, oczekuje, że nazwa pliku lub plików będzie działać jako argument.
Gilles 'SO - przestań być zły'
@manatwork Problem polega na tym, że nie mogę zlokalizować i otworzyć nazwy pliku ze spacjami. Np. To polecenie otworzy wiele plików w vimie: zlokalizuj I \ have \ to \ download | xargs vi
Santosh Kumar
3

Możesz użyć rozszerzenia poleceń:

vi "$(locate filename123 | head -n1)"

Aby vimprzeczytać jego standardowe wejście, możesz to zrobić vim -, ale to po prostu da ci wynik, locatektórego ścieżkami są nazwy plików. Może to jednak działać, użycie vim gfnormalnego polecenia spowoduje otwarcie ścieżki, na której znajduje się kursor.

Edytować

W przypadku nazw plików ze spacjami lepiej jest użyć xargswspomnianej opcji lub vimrozwiązania opisanego powyżej. Uwaga: aby wykonać gfpracę, musisz dodać miejsce do isfname:

set isfname+=32

Ta wskazówka i alternatywy są opisane tutaj .

Edytuj 2

Dodano cytaty i headjak sugeruje PeterO w komentarzach .

Thor
źródło
Dla pliku z białymi spacjami, kiedy wstawiam \ do nazwy pliku, np. Vi $ (znajdź inny \ plik). Vim otwiera go jako dwa osobne pliki anotheri file:(.
Santosh Kumar
Twoja odpowiedź działa tylko wtedy, gdy nie mam spacji w pliku, który lokalizuję.
Santosh Kumar,
Odpowiedź zaktualizowana.
Thor
2
@Thor: W przypadku pojedynczego pliku, jak wspomniano w pytaniu, wystarczy owinąć cudzysłowy wokół podstawienia procesu: vi "$(locate filename123)"... Aby upewnić się, że ma on tylko jedną nazwę pliku do obsługi:vi "$(locate filename123 |head -n1)"
Peter.O
PeterO: Masz rację, testowałem tylko z wieloma hitami. Dodałem twoje komentarze do odpowiedzi.
Thor
1

Najprostszym sposobem jest podanie locatejako podstawienia powłoki , na przykład:

vim $(locate filename123)

Możesz również rozważyć użycie findzamiast locateprzekazywania nazw plików do edycji, na przykład:

find . -name 'filename123' -exec vim {} +

W systemie Unix / OSX można używać xargsz -oparametrem, takim jak:

locate filename123 | xargs -o vim

-oPonownie otwórz stdin jako / dev / tty w procesie potomnym przed wykonaniem polecenia. Jest to przydatne, jeśli chcesz, aby xargs uruchamiał interaktywną aplikację.

Lub w systemie Linux wypróbuj następujące obejście, używając:

locate filename123 | xargs -J% sh -c 'vim < /dev/tty $@'

Jeśli używasz różnych poleceń, użyj substytucji poleceń, aby to osiągnąć, na przykład:

vim $(locate filename123)
vim `locate filename123`

Alternatywnie użyj GNU parallelzamiast xargswymusić alokację tty, na przykład:

locate filename123 | parallel -X --tty vi

Uwaga: parallelw systemach Unix / OSX nie będzie działać, ponieważ ma inne parametry i nie obsługuje tty.

Wiele innych popularnych komend zapewnia alokację pseudo-tty a także (jak -tw ssh), więc sprawdzić o pomoc.

Inną sugestią byłoby użycie vipe(potok poleceń Vima) lub użycie następującego prostego skryptu:

#!/bin/sh
# usage: locate filename123 | vip
exec vim < /dev/tty "$@"

Związane z:

kenorb
źródło