Misalkan saya memiliki file bernama filename123.txt
dan itu adalah file tunggal yang dinamai demikian, dan saya dapat locate
melakukannya dengan perintah locate filename123
. Dan hanya mengembalikan file ini.
Sekarang saya ingin membukanya dengan vi
/ vim
. Tapi saya tidak ingin pergi ke lokasi itu dan ketik vi
perintah yang diikuti oleh nama file. Di sini saya ingin hasilnya locate filename123
ditambahkan ke perintah vi. Bagaimana saya bisa melakukannya? Saya sudah mencoba:
locate filename123 | vi
Tetapi ini tidak berhasil. Dan kesalahan ini muncul di terminal:
santosh@santosh:~$ locate filename123 | vi
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: Finished.
command-line
terminal
vim
io-redirection
locate
Santosh Kumar
sumber
sumber
Jawaban:
Anda bisa menggunakan
xargs
:Secara default
xargs
akan mengeksekusi sesedikit contoh perintah yang ditentukan sebanyak mungkin, melewati parameter sebanyak mungkin sesuai dengan ARG_MAX sistem . Untuk membatasi jumlah parameter yang diteruskan ke instancevi
, gunakan opsixargs
'-n
.Untuk menangani nama file yang mengandung spasi gunakan opsi
xargs
'-d
:Untuk menangani nama file yang berisi baris menggunakan
xargs
'-0
pilihan bersama denganlocate
' s-0
pilihan:(Jika
-0
tidak tersedia pada salah satu dari mereka, periksa--null
juga, atau cara lain untuk menentukan karakter\000
sebagai pembatas.)sumber
locate
perintah sebagai input ke vi. Vi, seperti program lain, mengharapkan nama file untuk dikerjakan sebagai argumen.Anda dapat menggunakan ekspansi perintah:
Untuk membuat
vim
read nya stdin dapat Anda lakukanvim -
, tetapi itu hanya akan memberi Anda outputlocate
yang merupakan path nama file. Ini mungkin bekerja meskipun, menggunakanvim
gf
perintah normal kemudian akan membuka path tempat kursor aktif.Edit
Dalam hal nama file dengan spasi di dalamnya, Anda lebih baik menggunakan
xargs
opsi yang disebutkan atauvim
solusi yang dijelaskan di atas. Catatan untuk membuatgf
pekerjaan Anda perlu menambahkan ruang keisfname
:Kiat dan alternatif ini dijelaskan di sini .
Edit 2
Menambahkan kutipan dan
head
seperti yang disarankan oleh PeterO dalam komentar .sumber
another
danfile
:(.vi "$(locate filename123)"
... Untuk memastikan bahwa itu hanya memiliki satu nama file untuk berurusan dengan:vi "$(locate filename123 |head -n1)"
Cara paling sederhana adalah untuk lulus
locate
sebagai substitusi shell , seperti:Anda juga dapat mempertimbangkan untuk menggunakan
find
alih-alihlocate
memberikan nama file untuk diedit, misalnya:Pada Unix / OSX Anda dapat menggunakan
xargs
dengan-o
parameter, seperti:Atau di Linux coba solusi berikut menggunakan:
Jika Anda menggunakan perintah yang berbeda, gunakan substitusi perintah untuk mencapai itu, seperti:
Atau gunakan GNU
parallel
alih-alihxargs
untuk memaksa alokasi tty, misalnya:Catatan:
parallel
pada Unix / OSX tidak akan berfungsi karena memiliki parameter yang berbeda dan tidak mendukung tty.Banyak perintah populer lainnya menyediakan alokasi pseudo-tty juga (seperti
-t
dalamssh
), jadi periksa bantuan.Saran lain akan menggunakan
vipe
(pipa perintah Vim) atau menggunakan skrip sederhana berikut:Terkait:
sumber