যদিও এটি একটি পুরানো প্রশ্ন, এটি আমার কাছে মনে হচ্ছে এটি বহুবর্ষজীবী প্রশ্ন এবং এখন পর্যন্ত প্রস্তাবিত পরামর্শের চেয়ে আরও সাধারণ, পরিষ্কার সমাধান পাওয়া যায়। ক্রেডিট যেখানে creditণ দেওয়ার কথা: আমি নিশ্চিত না যে স্টাফেন চেজেলাস <>
আপডেট অপারেটরের উল্লেখ না করেই আমি এটি নিয়ে এসেছি ।
বোর্ন শেল আপডেট করার জন্য একটি ফাইল খোলার সীমাবদ্ধ ইউটিলিটি। শেলটি আপনাকে কোনও ফাইল সন্ধানের জন্য এবং তার নতুন দৈর্ঘ্য নির্ধারণ করার কোনও উপায় দেয় না (যদি পুরানোটির চেয়ে ছোট হয়)। তবে এটি সহজে প্রতিকার করা যায়, তাই খুব সহজেই আমি অবাক হয়ে যাই এটি কোনও স্ট্যান্ডার্ড ইউটিলিটিগুলির মধ্যে নয় /usr/bin
।
এইটা কাজ করে:
$ grep -n foo T
8:foo
$ (exec 4<>T; grep foo T >&4 && ftruncate 4) && nl T;
1 foo
এটি যেমন করে (স্টাফেনের টুপি টিপ):
$ { grep foo T && ftruncate; } 1<>T && nl T;
1 foo
(আমি জিএনইউ গ্রেপ ব্যবহার করছি he তার উত্তর লেখার পর থেকে সম্ভবত কিছু পরিবর্তন হয়েছে))
ব্যতীত, আপনার কাছে / usr / bin / ftruncate নেই । সি এর কয়েক ডজন লাইনের জন্য, আপনি নীচে দেখতে পারেন। এই ফ্রন্টসেট ইউটিলিটি স্ট্যান্ডার্ড আউটপুট এবং বর্তমান অবস্থানে ডিফল্ট করে একটি স্বেচ্ছাসেবী ফাইল বর্ণনাকারীকে একটি স্বেচ্ছাসেবী দৈর্ঘ্যে ছাঁটাই করে দেয় ।
উপরের কমান্ড (1 ম উদাহরণ)
T
আপডেটের জন্য ফাইল বর্ণনাকারী 4 চালু করে op ওপেন (2) এর মতোই, ফাইলটি খোলার ফলে বর্তমান অফসেটটি 0 তে অবস্থিত।
- গ্রেপ এর পরে
T
সাধারণত প্রক্রিয়া করা হয় এবং শেলটি তার আউটপুটটিকে T
বিবরণকারী 4 এর মাধ্যমে পুনঃনির্দেশ করে ।
- ftruncate ftruncate (2) বর্ণনাকারী 4 এ কল করে, বর্তমান অফসেটের মানটির দৈর্ঘ্য নির্ধারণ করে (ঠিক যেখানে গ্রেপ এটি রেখেছিল)।
Subshell তারপর প্রস্থান করে, বর্ণনাকারী 4. বন্ধ এখানে ftruncate :
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main( int argc, char *argv[] ) {
off_t i, fd=1, len=0;
off_t *addrs[2] = { &fd, &len };
for( i=0; i < argc-1; i++ ) {
if( sscanf(argv[i+1], "%lu", addrs[i]) < 1 ) {
err(EXIT_FAILURE, "could not parse %s as number", argv[i+1]);
}
}
if( argc < 3 && (len = lseek(fd, 0, SEEK_CUR)) == -1 ) {
err(EXIT_FAILURE, "could not ftell fd %d as number", (int)fd);
}
if( 0 != ftruncate((int)fd, len) ) {
err(EXIT_FAILURE, argc > 1? argv[1] : "stdout");
}
return EXIT_SUCCESS;
}
NB, ftruncate (2) এইভাবে ব্যবহার করার সময় ননপোর্টেবল। নিখুঁত সাধারণতার জন্য, সর্বশেষ লিখিত বাইটটি পড়ুন, ফাইলটি O_WRONLY আবার খুলুন, সন্ধান করুন, বাইটটি লিখুন এবং বন্ধ করুন।
এই প্রশ্নটি 5 বছরের পুরানো দেওয়া, আমি এই সমাধানটি প্রকাশ্য বলতে যাচ্ছি। এটি একটি নতুন বর্ণনাকারী এবং অপারেটর খোলার জন্য এক্সেকের সুবিধা নেয় <>
যা উভয়ই আরকেন। আমি কোনও স্ট্যান্ডার্ড ইউটিলিটি ভাবতে পারি না যা ফাইল ডেস্ক্রিপ্টরের মাধ্যমে কোনও ইনডকে ম্যানিপুলেট করে। (বাক্য ftruncate >&4
গঠনটি হতে পারে তবে আমি নিশ্চিত যে উন্নতি করছি না।) এটি ক্যামের দক্ষ, অনুসন্ধানী উত্তরের চেয়ে যথেষ্ট সংক্ষিপ্ত। এটি স্টাফেনের আইএমও থেকে একটু পরিষ্কার, যদি না আপনি পার্লকে আমার চেয়ে বেশি পছন্দ করেন। আমি আশা করি যে কেউ এটি দরকারী হবে।
একই জিনিসটি করার একটি ভিন্ন উপায় হ'ল lseek (2) এর একটি এক্সিকিউটেবল সংস্করণ যা বর্তমান অফসেটটি রিপোর্ট করে; আউটপুটটি / usr / bin / truncate ব্যবহার করা যেতে পারে , যা কিছু লিনাক্সির সরবরাহ করে।