একাধিক ফাইলকে কীভাবে সনাক্ত করতে এবং সেগুলিকে ভিমে খুলতে হয়?


10

মনে করুন যে আমার কাছে একটি ফাইল রয়েছে filename123.txtএবং এটি একক ফাইল যা নামকরণ করেছে, এবং আমি locateএটি কমান্ড দিয়ে করতে পারি locate filename123। এবং এটি কেবল এই ফাইলটি ফেরত দেয়।

এখন আমি এটি vi/ দিয়ে খুলতে চাই vim। তবে আমি সেই জায়গায় গিয়ে viফাইলের নাম অনুসারে কমান্ডটি টাইপ করতে চাই না । এখানে আমি ফলাফলটি locate filename123vi কমান্ডের সাথে যুক্ত করা চাই। আমি কীভাবে এটি করতে পারি? আমি ইতিমধ্যে চেষ্টা করেছি:

locate filename123 | vi

তবে এটি কাজ করে না। এবং এই ত্রুটিটি টার্মিনালে আসে:

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

উত্তর:


12

আপনি ব্যবহার করতে পারেন xargs:

locate filename123 | xargs vi

ডিফল্টরূপে xargsসিস্টেমের এআরজি_ম্যাক্স অনুযায়ী যতটা সম্ভব প্যারামিটারগুলি পাস করে যতটা সম্ভব নির্দিষ্ট কমান্ডের কয়েকটি উদাহরণ কার্যকর করা হবে । এর একটি দৃষ্টান্ত প্রেরণ পরামিতি সংখ্যা সীমা vi, ব্যবহার xargs' -nবিকল্প।

হাতল ফাইল স্পেস ধারণকারী নাম করার জন্য ব্যবহার xargs' -dবিকল্প:

locate filename123 | xargs -d '\n' vi

নিউলাইনযুক্ত ফাইলের নামগুলি হ্যান্ডেল করতে xargs' -0বিকল্পের সাথে locate' -0বিকল্প ব্যবহার করুন:

locate -0 filename123 | xargs -0 vi

(যদি তাদের -0কোনওটিতে না পাওয়া যায় তবে --nullখুব বেশি, বা \000ডিলিমিটার হিসাবে চরিত্র নির্দিষ্ট করার জন্য অন্য কোনও উপায় পরীক্ষা করে দেখুন ))


এই ফাইলটি খোলার আগে আমাকে কী আটকাচ্ছিল তা আমাকে বলতে পারেন?
সন্তোষ কুমার

1
@ সন্তোষ আপনি vi এর ইনপুটlocate হিসাবে কমান্ডের আউটপুটটি পাস করছিলেন । ভি, অন্যান্য প্রোগ্রামের মতো, ফাইল (গুলি) এর নামটি যুক্তি হিসাবে কাজ করবে বলে আশা করে।
গিলস 'অশুভ হওয়া বন্ধ করুন'

@ মান্যাটওয়ার্ক সমস্যা হ'ল আমি এটির ফাঁকা স্থান সহ ফাইলের নামটি সনাক্ত করতে এবং খুলতে পারি না। উদাহরণস্বরূপ এই কমান্ডটি একাধিক ফাইল vim খুলবে: I I have \ to \ ডাউনলোড | সনাক্ত করুন xargs vi
সন্তোষ কুমার

3

আপনি কমান্ড সম্প্রসারণ ব্যবহার করতে পারেন:

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

vimএর স্টিডিনটি পড়ার জন্য আপনি করতে পারেন vim -, তবে এটি আপনাকে locateফাইলের নাম পথ বলে দেয়। এটি যদিও কাজ করতে পারে, vim gfসাধারণ কমান্ড ব্যবহার করে কার্সারটি চালু হওয়ার পথটি উন্মুক্ত হবে।

সম্পাদন করা

ফাঁকা জায়গাগুলির ফাইল নামগুলির ক্ষেত্রে আপনি xargsউল্লিখিত বিকল্পটি বা vimউপরে বর্ণিত সমাধানটি ব্যবহার করা ভাল । gfকাজ করার জন্য দ্রষ্টব্য আপনার এতে স্থান যুক্ত করতে হবে isfname:

set isfname+=32

এই টিপ এবং বিকল্পগুলি এখানে বর্ণিত হয়েছে

সম্পাদনা 2

মন্তব্যগুলিতেhead পিটারের পরামর্শ অনুসারে যুক্ত উক্তি এবং যোগ করা হয়েছে ।


সেগুলিতে শ্বেত স্পেসযুক্ত ফাইলের জন্য, যখন আমি vi ফাইলের মতো vi ফাইলের নামটি sertোকান (অন্য কোনও ফাইলের সন্ধান করুন)। তেজ দুটি পৃথক ফাইল যেমন খোলে, anotherএবং file:(।
সন্তোষ কুমার

আপনার উত্তরটি কেবল তখনই কার্যকর হয় যখন আমি যে ফাইলটি সন্ধান করছি তাতে আমার কোনও স্থান নেই।
সন্তোষ কুমার

উত্তর আপডেট হয়েছে।
থোর

2
@ থোড়: একক ফাইলের জন্য, যেমনটি প্রশ্নে উল্লিখিত হয়েছে, আপনাকে কেবল প্রক্রিয়া-প্রতিস্থাপনের চারপাশে উদ্ধৃতিগুলি আবৃত vi "$(locate filename123)"করতে হবে : ... এটির মোকাবেলায় কেবল একটি ফাইলের নাম রয়েছে তা নিশ্চিত করার জন্য :vi "$(locate filename123 |head -n1)"
পিটার.ও

পিটারো: আপনি ঠিক বলেছেন, আমি কেবল একাধিক হিট দিয়ে পরীক্ষা করেছি। আমি উত্তরে আপনার মন্তব্য যুক্ত করেছি।
থোর

1

সবচেয়ে সহজ উপায় শেল সাবস্টিটিউশনlocate হিসাবে পাস করা যেমন :

vim $(locate filename123)

আপনি সম্পাদনা করার জন্য ফাইলের নাম পাস করার findপরিবর্তে ব্যবহার করার কথা বিবেচনা করতে পারেন locate, উদাহরণস্বরূপ:

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

ইউনিক্স / ওএসএক্স এ আপনি প্যারামিটার xargsসহ ব্যবহার করতে পারেন -o:

locate filename123 | xargs -o vim

-oকমান্ডটি কার্যকর করার আগে শিশু প্রক্রিয়ায় স্ট্যান্ডিনকে / dev / tty হিসাবে আবার খুলুন। আপনি যদি একটি ইন্টারেক্টিভ অ্যাপ্লিকেশন চালাতে xargs চান তবে এটি কার্যকর।

অথবা লিনাক্সে নিম্নলিখিত ব্যবহারগুলি ব্যবহার করে চেষ্টা করুন:

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

আপনি যদি বিভিন্ন কমান্ড ব্যবহার করেন তবে তা অর্জন করতে কমান্ড প্রতিস্থাপন ব্যবহার করুন , যেমন:

vim $(locate filename123)
vim `locate filename123`

টিটি বরাদ্দের জোর করার parallelপরিবর্তে বিকল্পভাবে জিএনইউ ব্যবহার করুন xargs, উদাহরণস্বরূপ:

locate filename123 | parallel -X --tty vi

দ্রষ্টব্য: parallelইউনিক্স / ওএসএক্সে বিভিন্ন পরামিতি রয়েছে বলে এটি কাজ করবে না এবং এটি tty সমর্থন করে না।

আরও অনেক জনপ্রিয় কমান্ড সিউডো-টিটি বরাদ্দ দেয় (যেমন পছন্দ -tকরে ssh), তাই সাহায্যের জন্য পরীক্ষা করুন।

অন্যান্য পরামর্শ vipeহ'ল (একটি ভিম কমান্ড পাইপ) ব্যবহার করা বা নিম্নলিখিত সহজ স্ক্রিপ্টটি ব্যবহার করা:

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

সম্পর্কিত:

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.