আমার প্রায় 20K ফাইল সহ একটি ফোল্ডার রয়েছে। ফাইলগুলি প্যাটার্ন অনুসারে নামকরণ করা হয়েছে xy_{\d1,5}_{\d4}\.abc
, যেমন xy_12345_1234.abc
। আমি এই কমান্ডটি ব্যবহার করে তাদের মধ্যে প্রথম 10 কে সংক্ষেপ করতে চেয়েছিলাম:
ls | sort -n -k1.4,1.9 | head -n10000 | xargs tar -czf xy_0_10000.tar.gz
তবে ফলাফল প্রাপ্ত ফাইলটির ভিতরে প্রায় 2K ফাইল ছিল।
ls | sort -n -k1.4,1.9 | head -n10000 | wc -l
তবে প্রত্যাশিত হিসাবে 10000 প্রদান করে।
আমার কাছে মনে হচ্ছে আমি এখানে কিছু বেসিক ভুল বুঝছি ...
আমি লিনাক্স পুদিনা 17.1, জিএনইউ টার্ন 1.27.1 এ zsh 5.0.2 ব্যবহার করছি
সম্পাদনা করুন:
@ আর্চামারের পরামর্শ অনুসারে কাঁটাচামচ করা খুব প্রশ্রয়জনক শোনায়, সর্বশেষতম কাঁটাচামচ ফলে ফাইলটি ওভাররাইট করে - ফাইলটিতে ফাইলগুলির 'লেজ' রয়েছে - 7773 থেকে 9999 পর্যন্ত ।
ফলাফল xargs --show-limit
:
Your environment variables take up 3973 bytes
POSIX upper limit on argument length (this system): 2091131
POSIX smallest allowable upper limit on argument length (all systems): 4096
Maximum length of command we could actually use: 2087158
Size of command buffer we are actually using: 131072
প্রতিস্থাপন -c
করা -r
বা -u
আমার ক্ষেত্রে কাজ করে না। ত্রুটি বার্তা ছিলtar: Cannot update compressed archives
উভয় ব্যবহার করে -r
এবং -u
অবৈধ এবং এর সাথে ব্যর্থ হয়tar: You may not specify more than one '-Acdtrux', '--delete' or '--test-label' option
প্রতিস্থাপন -c
সঙ্গে -a
পাশাপাশি অবৈধ বলে মনে হচ্ছে এবং একই সঙ্গে ব্যর্থ tar: You must specify one of the '-Acdtrux', '--delete' or '--test-label' options
যদিও আমি বিষয়টি স্বীকার করে azf
এবং Acdtrux
আমাকে বিচ্ছিন্ন বলে মনে হচ্ছে।
সম্পাদনা 2:
- এটি দেখতে ভাল উপায়, আমি এখানে একটি উদাহরণও পেয়েছি ।
তবে আমি যখন চেষ্টা করি
ls | sort -n -k1.4,1.9 | head -n10000 | tar -czf xy_0_10000.tar.gz -T -
আমি পাই
tar: option requires an argument -- 'T'
ভাল, সম্ভবত ফাইলের নামগুলি ডলার না পৌঁছায়? তবে দেখে মনে হচ্ছে এগুলি কর, কারণ যখন আমি মৃত্যুদন্ড কার্যকর করি
ls | sort -n -k1.4,1.9 | head -n10000 | tar --null -czf xy_0_10000.tar.gz -T -
আমি পাই
tar: xy_0_.ab\nxy_1_...<the rest of filenames separated by literal \n>...998.ab
Cannot stat: File name too long
তাহলে তারার ফাইল নাম কেন দেখছে না?
ls
find
, এতে -print0
একটি নিউলাইন পরিবর্তে ডিলিমেটার হিসাবে নাল বাইট ব্যবহার করার বিকল্প রয়েছে । পতাকা sort
দিয়ে যে পরিচালনা করতে পারেন -z
। head
দুর্ভাগ্যবশত নাল বাইট বিভেদক বুঝতে হ্যান্ডেল করে না, কিন্তু এই উত্তর একটি সলিউশন ব্যবহার হয়েছে tr
swap 'র জন্য \n
এবং \0
আগে ও পরে head
। tar
হয়েছে --null -T -
থেকে নাল সীমায়িত ফাইলের নাম পড়তে stdin
।