আমার কাছে 20 গিগাবাইটেরও বেশি 10k + ফাইল রয়েছে যা আমাকে একটি ফাইলে সংযুক্ত করতে হবে।
এর চেয়ে আরও দ্রুত উপায় আছে কি?
cat input_file* >> out
?
পছন্দসই উপায়টি ব্যাশ কমান্ড হবে, যথেষ্ট ধীর না হলে পাইথনও গ্রহণযোগ্য।
আমার কাছে 20 গিগাবাইটেরও বেশি 10k + ফাইল রয়েছে যা আমাকে একটি ফাইলে সংযুক্ত করতে হবে।
এর চেয়ে আরও দ্রুত উপায় আছে কি?
cat input_file* >> out
?
পছন্দসই উপায়টি ব্যাশ কমান্ড হবে, যথেষ্ট ধীর না হলে পাইথনও গ্রহণযোগ্য।
উত্তর:
না, বিড়াল অবশ্যই এটি করার সর্বোত্তম উপায়। এই উদ্দেশ্যে সিটিতে ইতিমধ্যে একটি প্রোগ্রাম লিখিত আছে কেন অজগর ব্যবহার করবেন? তবে, xargs
কমান্ড লাইনের দৈর্ঘ্য বেশি হয়ে গেলে ARG_MAX
এবং আপনার একাধিকের প্রয়োজন হলে আপনি ব্যবহারটি বিবেচনা করতে পারেন cat
। জিএনইউ সরঞ্জামগুলি ব্যবহার করে এটি আপনার ইতিমধ্যে যা আছে তার সমান:
find . -maxdepth 1 -type f -name 'input_file*' -print0 |
sort -z |
xargs -0 cat -- >>out
find
পাইপ করা হয়েছে sort
। এটি ছাড়া ফাইলগুলি একটি স্বেচ্ছাসেবী ক্রমে তালিকাভুক্ত করা হবে (ফাইল সিস্টেম দ্বারা সংজ্ঞায়িত, যা ফাইল তৈরির আদেশ হতে পারে)।
bash
। তা না হলে আমি কোনো ক্ষেত্রে যেখানে দেখতে না xargs
বা cat
আশানুরূপ আচরণ না।
xargs
কল করবে cat
(2)
প্রথমে আউটপুট ফাইলের জন্য স্থান বরাদ্দকরণ সামগ্রিক গতির উন্নতি করতে পারে কারণ সিস্টেমকে প্রতিটি লেখার জন্য বরাদ্দ আপডেট করতে হবে না।
উদাহরণস্বরূপ, লিনাক্সে থাকলে:
size=$({ find . -maxdepth 1 -type f -name 'input_file*' -printf '%s+'; echo 0;} | bc)
fallocate -l "$size" out &&
find . -maxdepth 1 -type f -name 'input_file*' -print0 |
sort -z | xargs -r0 cat 1<> out
আরেকটি সুবিধা হ'ল পর্যাপ্ত ফাঁকা জায়গা না থাকলে অনুলিপিটি চেষ্টা করা হবে না।
যদি চালু থাকে তবে btrfs
আপনি copy --reflink=always
প্রথম ফাইলটি (যা কোনও ডেটা অনুলিপি বোঝায় না এবং তাই প্রায় তাত্ক্ষণিক হবে), এবং বাকীটি সংযোজন করতে পারেন। যদি 10000 ফাইল থাকে তবে সম্ভবত প্রথম ফাইলটি খুব বড় না হওয়া সত্ত্বেও এটি খুব বেশি পার্থক্য করতে পারে না।
সমস্ত ফাইল (দ্য BTRFS_IOC_CLONE_RANGE
ioctl
) কে পুনরায় অনুলিপি করতে সাধারণীকরণের জন্য একটি এপিআই রয়েছে , তবে আমি সেই এপিআইটি প্রকাশ করে এমন কোনও ইউটিলিটি পাইনি, সুতরাং আপনাকে এটি সিতে করতে হবে ( python
বা অন্য ভাষাগুলি যদি তারা নির্বিচারে কল করতে পারে ioctl
) ।
যদি উত্স ফাইলগুলি অপ্রয়োজনীয় হয় বা NUL টি অক্ষরের বৃহত্তর ক্রম থাকে তবে আপনি (GNU সিস্টেমে) সাথে একটি স্পারস আউটপুট ফাইল (সময় এবং ডিস্কের স্থান সাশ্রয় করে) তৈরি করতে পারেন:
find . -maxdepth 1 -type f -name 'input_file*' -print0 |
sort -z | xargs -r0 cat | cp --sparse=always /dev/stdin out
>
না >>
, কিন্তু 1<>
লিখতে আমি আগেই বলেছি মধ্যে ফাইল।
<>
হ'ল স্ট্যান্ডার্ড বোর্ন / পসিক্স রিড + রাইটিং রিডাইরেশন অপারেটর। বিশদের জন্য আপনার শেল ম্যানুয়াল বা পসিক্স স্পেসটি দেখুন। ডিফল্ট fd
হল 0
জন্য <>
অপারেটর ( <>
-এর সংক্ষিপ্ত রূপ 0<>
, মত <
-এর সংক্ষিপ্ত রূপ 0<
এবং >
স্বল্প 1>
যাতে আপনি প্রয়োজন,) 1
স্পষ্টভাবে পুনর্নির্দেশ stdout- এ। এখানে, এটি এতোটুকুও নয় যে আমাদের + লিখুন ( O_RDWR
) পড়তে হবে , তবে আমরা চাই না O_TRUNC
(যেমন হিসাবে >
) আমরা কী বরাদ্দ করেছি তা হ্রাস করতে পারে।
dd
পড়া বা পড়া মাধ্যমে এগিয়ে চাইতে পারেন ।
fallocate
ঘটবে যেখানে অতিরিক্তের ওভারহেডটিকে উপেক্ষা করা হবে find
, যদিও এটি দ্বিতীয়বারের মতো দ্রুত হবে। btrfs
অবশ্যই কিছু আকর্ষণীয় সম্ভাবনা খোলে যদিও।
find
শেল গ্লোব হিসাবে একই ফাইল বাছাই করে না।