লিনাক্সে vi এর মাধ্যমে ফিরে আসা সমস্ত ফাইলকে কীভাবে সম্পাদনা করব?


27

আমি নিজেকে অনেক কিছু করতে দেখছি তা হ'ল ফাইন্ড কমান্ড চালাচ্ছে এবং তারপরে সেগুলি সবগুলি ভিআইতে সম্পাদনা করা হচ্ছে যা দেখতে এরকম কিছু দেখাচ্ছে:

> find . "*.txt"
./file1.txt
./file2.txt
./path/to/file3.txt

> vi ./file1.txt ./file2.txt ./path/to/file3.txt

একটি কমান্ড লাইনে এগুলি করার কোনও চতুর এবং সহজ উপায় আছে?


1
আপনি এটি vi তে পাইপ করতে পারেন: সন্ধান করুন। "* .txt" | xargs vi
ম্যাক্লেড

1
@MaQleod: টেকনিক্যালি এটা বংশীধ্বনিতুল্য হবে xargs
মাধ্যাকর্ষণ


পাইপিং xargsআমার শেল টার্মিনাল ধ্বংস করতে । সঠিক সমাধানটি নীচে দেওয়া হয়েছে @ ডেডসোলার
টাইপলজিক

উত্তর:


41

এই কৌতুক করতে হবে:

find . -name "*.txt" -exec vim {} + 

ভিম ব্যবহার করুন, এটি আপনার স্বাস্থ্যের জন্য ভাল। :-)

সমস্ত ফাইলের নাম (লাইন দৈর্ঘ্যের সীমা অবধি) এক লাইনে উপস্থিত করার +জন্য অপ্রচলিত বিকল্পটি -exec, যেমন আপনি এখনও একটি vim সেশনে সমস্ত ফাইল খোলেন ( :nপরবর্তী এবং পরবর্তী জন্য নেভিগেট করেছেন):N পূর্ববর্তী ফাইলের জন্য )।

সঙ্গে vim -pআপনি প্রতিটি ফাইলের জন্য একটি ফাইল ট্যাব পেতে। চেক:help tab-page-commandsআরও বিশদ জন্য করুন।

সঙ্গে vim -oআপনি প্রতিটি ফাইলের জন্য অনুভূমিকভাবে বিভক্ত জানালা পেতে, হবে vim -Oবিভক্ত জানালা উল্লম্বভাবে। চেক:help window-move-cursorআরও বিশদ জন্য করুন।

মনে রাখবেন যে এই উত্তরটির পূর্ববর্তী সংস্করণ, vim $(find . -name "*.txt") ফাইলনেমগুলিতে ফাঁকা জায়গা নিয়ে কাজ করে না এবং এতে সুরক্ষা জড়িত।

পাইপ দেওয়া সম্পূর্ণরূপে বগাস আচরণের পরে xargs viএকটি Warning: Input is not from a terminal, আরও একটি টার্মিনাল দেয় । ব্যবহারকারী মাধ্যাকর্ষণ কেন নীচে একটি মন্তব্যে, এবং এই প্রশ্নে আরও কিছুটা ব্যাখ্যা সহ ব্যাখ্যা করেছেন ।


4
আপনি ভিএম সম্পর্কে কতটা জানেন তা জানেন না, তবে এটি আমাকে / চিরকালের জন্য / ধরেছিল তা নির্ধারণ করতে: n পরবর্তী ফাইলটি দেখায় এবং: এন পূর্ববর্তীটি দেখায়।
zpletan

4
@ দেভসোলার: ভিম তার স্ট্যান্ডিনটি তার নিয়ন্ত্রণকারী টার্মিনালের মতোই প্রত্যাশা করে এবং সরাসরি স্টিডিনে টার্মিনাল-সম্পর্কিত বিভিন্ন আইওক্টেল সম্পাদন করে। (আপনি এটি একটি বাগ বিবেচনা করতে পারেন V Vim অবশ্যই এটি খুলতে /dev/ttyএবং কল করতে পারে আইকটিএল () এটি করতে খুব অলস /dev/null
মাধ্যাকর্ষণ

3
@zpletan: vim -pআপনি যদি ফাইল ট্যাবগুলি চান। ( gtএবং gTনেভিগেট করতে, বা আপনার মাউস দিয়ে ক্লিক করুন))
গ্রাভিটি

2
অবগতির জন্য, যখন মধ্যে বংশীধ্বনিতুল্য সতর্কবার্তা এড়াতে vimশুধু উল্লেখ -হিসাবে প্রথম আর্গুমেন্ট হিসাবে, echo foobar | vim -
কনরাড রুডলফ

2
@ কনরাদ রুডল্ফ: find . -name "*.txt" | vim -আপনাকে পাওয়া যায়নি এমন ফাইলগুলির নাম সম্বলিত একটি নামহীন ফাইলে একটি ভিএম সেশন দেয় যা ওপি যা বলেছিল তা নয় ...
দেবসোলার


1

অতিরিক্তভাবে, আপনি যদি একবারে সেগুলি একবার খুলতে চেয়েছিলেন তবে আপনি ফাইন্ড-এক্সেক ব্যবহার করতে পারেন বা লুপের জন্য একটি সাধারণ ব্যবহার করতে পারেন। ছাদ এর মন্তব্য সম্পাদিত।

find . -name "*.txt" -exec vi {} \;

অথবা

OLDIFS=$IFS
IFS=$(echo -en "\n\b")
for i in `find . -name "*.txt"`
    do
        vi $i
    done
IFS=$OLDIFS

... তবে আপনি কেন এটি করতে চান?
দেবসোলার

@ ডেভসোলার প্রথমটি সন্ধানের সক্ষমতাটি চিহ্নিত করা, দ্বিতীয়টি সাধারণ উদ্দেশ্য লুপ। সম্ভবত আপনি প্রতিটি ফাইল সম্পাদনা করার আগে কিছু করতে চান।
ওল্ড ওল্ফ

আপনি কি দ্বিতীয়বার চেষ্টা করেছেন? প্রথম: অনুসন্ধানটি বর্তমান ডিরেক্টরিটি দেয় কারণ -nameঅনুপস্থিত। এবং দ্বিতীয়: একটি ফাইলের নাম অন্তর্ভুক্ত হওয়ার সাথে সাথে কমান্ডটি খারাপভাবে ব্যর্থ হয়। অসুস্থ পরামর্শ দেওয়া উত্তরের জন্য -1।

প্রকৃতপক্ষে, ফাইলের নামগুলিতে ফাঁকির বিষয়টি আমার উত্তরের সাথেও প্রযোজ্য। কমান্ড লাইন থেকে এটির নিজের একটি ছোট স্ক্রিপ্টে পরিণত না করে এগুলি সঠিকভাবে পরিচালনা করার উপায় আমি ভাবতেও পারি না। ফাইলনামে ফাঁকা স্থান নিরুৎসাহিত করার একটি ভাল কারণ রয়েছে।
দেবসোলার

একটি বৈধ পয়েন্ট আমি মনে করি যে মূল পোস্টারগুলি তার প্রয়োজনের জন্য বৈধ ছিল। সম্পাদনা করা।
ওল্ড ওল্ফ

0

আপনি যদি ইতিমধ্যে আপনার findকমান্ডটি টাইপ করে থাকেন তবে আমি দেখতে পাচ্ছি যে xargsঅনুসন্ধান ফলাফলগুলি খোলার জন্য এটি ব্যবহার করা আরও সহজ হতে পারে :

find . -name "*.txt" | xargs vim -p

-pবিকল্প তেজ বলে একটি নতুন ট্যাবে প্রতিটি ফাইল খুলতে। আমি কেবল বাফার ব্যবহারের চেয়ে এটিকে আরও সুবিধাজনক বলে মনে করি, তবে আপনি যদি না চান তবে কেবলমাত্র এই বিকল্পটি ছেড়ে দিন।


আপনাকে ধন্যবাদ আমি এটি সনাক্ত করতে এটি সংযুক্ত করেছি যাতে আমার আদেশটি ছিল: ফাইলের নাম সনাক্ত করুন | xargs vim -p
talsibony

0

সব সম্পাদনা করতে *.txt, আপনি শুধু চালাতে পারেন: vim *.txt। দ্বারা ফিরে ফাইল সম্পাদনা করতে find, আরও পড়ুন।


ইউনিক্স / ম্যাকোজে, আপনি findবিএসডি xargs(দেখুন man xargs:) এর সাথে ব্যবহার করতে পারেন , যেমন

find -L . -name "*.txt" -type f -print0 | xargs -o -0 vim

-o( xargs): কমান্ডটি কার্যকর করার আগে শিশু প্রক্রিয়ায় স্ট্যান্ডিনটিকে / dev / tty হিসাবে পুনরায় খুলুন।

সম্পর্কিত: ভিম.এসইএস-xargs সহ ভিমকে অনুরোধ করার পরে টার্মিনাল বিরক্ত

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