Come `individuare` più file e aprirli in vim?


10

Supponiamo che io abbia un file chiamato filename123.txted è il singolo file che è chiamato così, e posso locatefarlo con il comando locate filename123. E restituisce solo questo file.

Ora voglio aprirlo con vi/ vim. Ma non voglio andare in quella posizione e digitare il vicomando seguito dal nome del file. Qui desidero che il risultato di locate filename123venga aggiunto al comando vi. Come posso farlo? Ho già provato:

locate filename123 | vi

Ma questo non funziona. E questo errore arriva nel terminale:

santosh@santosh:~$ locate filename123 | vi
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: Finished.

Risposte:


12

Puoi usare xargs:

locate filename123 | xargs vi

Per impostazione predefinita xargseseguirà il minor numero possibile di istanze del comando specificato, passando il maggior numero possibile di parametri in base all'ARG_MAX del sistema . Per limitare il numero di parametri passati a un'istanza di vi, utilizzare xargsl' -nopzione ' .

Per gestire i nomi dei file contenenti spazi utilizzare xargsl' -dopzione ' :

locate filename123 | xargs -d '\n' vi

Per gestire i nomi di file contenenti newline usa xargsl' -0opzione ' insieme all'opzione locate' -0:

locate -0 filename123 | xargs -0 vi

(Se -0non è disponibile su nessuno di essi, controllare --nullanche per , o un altro modo per specificare il carattere \000come delimitatore.)


Puoi dirmi cosa mi impediva di aprire questo file?
Santosh Kumar,

1
@Santosh Stavi passando l'output del locatecomando come input a vi. Vi, come qualsiasi altro programma, si aspetta che il nome dei file funzioni come argomenti.
Gilles 'SO- smetti di essere malvagio' il

@manatwork Il problema è che non riesco a individuare e aprire il nome file con spazi all'interno. Ad esempio, questo comando aprirà più file in vim: individuare I \ have \ to \ download | xargs vi
Santosh Kumar,

3

È possibile utilizzare l'espansione dei comandi:

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

Per farne vimleggere lo stdin puoi farlo vim -, ma questo ti darà solo l'output di locatecui sono i percorsi dei nomi di file. Questo potrebbe funzionare, tuttavia, utilizzando vim gfil comando normale si aprirà quindi il percorso su cui si trova il cursore.

modificare

Nel caso di nomi di file con spazi all'interno, è meglio utilizzare l' xargsopzione menzionata o la vimsoluzione sopra descritta. Nota per rendere il gflavoro necessario aggiungere spazio a isfname:

set isfname+=32

Questo suggerimento e le alternative sono descritte qui .

Modifica 2

Citazioni aggiunte e headcome suggerito da PeterO nei commenti .


Per i file con spazi bianchi, quando inserisco \ in nome file, come vi $ (individua un altro \ file). Il vim lo apre come due file separati anothere file:(.
Santosh Kumar il

La tua risposta funziona solo quando non ho spazi nel file che sto cercando.
Santosh Kumar,

Risposta aggiornata
Thor,

2
@Thor: Per un singolo file, come menzionato nella domanda, devi solo racchiudere le virgolette intorno alla sostituzione del processo: vi "$(locate filename123)"... Per assicurarti che abbia un solo nome di file da gestire:vi "$(locate filename123 |head -n1)"
Peter.O

PeterO: Hai ragione, ho provato solo con più colpi. Ho aggiunto i tuoi commenti alla risposta.
Thor,

1

Il modo più semplice è passare locatecome sostituzione della shell , come:

vim $(locate filename123)

Puoi anche considerare di utilizzare findinvece di locatepassare i nomi dei file da modificare, ad esempio:

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

Su Unix / OSX puoi usare xargscon -oparametri, come:

locate filename123 | xargs -o vim

-oRiaprire stdin come / dev / tty nel processo figlio prima di eseguire il comando. Ciò è utile se si desidera che xargs esegua un'applicazione interattiva.

O su Linux provare la soluzione alternativa seguente usando:

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

Se si utilizzano comandi diversi, utilizzare la sostituzione dei comandi per ottenere ciò, ad esempio:

vim $(locate filename123)
vim `locate filename123`

In alternativa, usa GNU parallelinvece di xargsforzare l'allocazione di tty, ad esempio:

locate filename123 | parallel -X --tty vi

Nota: parallelsu Unix / OSX non funzionerà in quanto ha parametri diversi e non supporta tty.

Molti altri comandi popolari forniscono anche un'allocazione pseudo-tty (come -tin ssh), quindi cerca aiuto.

Un altro suggerimento sarebbe di usare vipe(una pipe di comando Vim) o usare il seguente semplice script:

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

Relazionato:

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.