প্রতিজ্ঞা
সুনির্দিষ্ট নামের ফর্ম্যাট [ 1 , 2 ] সহ কেবল 15k ফাইলের জন্য আপনাকে সেই ত্রুটিটি কাটা উচিত নয় ।
আপনি যদি অন্য ডিরেক্টরি থেকে এই সম্প্রসারণটি চালাচ্ছেন এবং আপনাকে প্রতিটি ফাইলে পাথ যোগ করতে হয় তবে আপনার কমান্ডের আকার আরও বড় হবে এবং অবশ্যই এটি ঘটতে পারে।
সমাধান সেই ডিরেক্টরি থেকে কমান্ড চালায়।
(cd That/Directory ; cat file_{1..2000}.pdb >> file_all.pdb )
সর্বোত্তম সমাধান যদি এর পরিবর্তে আমি খারাপ অনুমান করে থাকি এবং আপনি ফাইলটি যে ডিরেক্টরিতে চালনা করেন এটি থেকে চালনা করুন ...
আইএমএইচও সর্বোত্তম সমাধান স্টাফেন চ্যাজেলাসের :
seq -f 'file_%.17g.pdb' 15000 | xargs cat > file_all.pdb
প্রিন্টফ বা সিক সহ; প্রাক-ক্যাশেডের মধ্যে কেবলমাত্র তাদের সংখ্যা সহ 15k ফাইলগুলিতে পরীক্ষিত এটি আরও দ্রুততর (বর্তমানে এবং একই ডিরেক্টরিতে ফাইলগুলি যে অপারেটিং সিস্টেমের মধ্যে রয়েছে ওপি বাদে) is
আরও কিছু শব্দ
আপনার শেল কমান্ড লাইনগুলিকে আরও দীর্ঘতর করতে সক্ষম হওয়া উচিত।
আপনার কমান্ড লাইনটি 213914 অক্ষর দীর্ঘ এবং 15003 শব্দ রয়েছে
cat file_{1..15000}.pdb " > file_all.pdb" | wc
... এমনকি প্রতিটি শব্দের জন্য 8 বাইট যোগ করা 333 938 বাইট (0.3M) থেকে খুব কম নীচে 2097142 (2.1M) দ্বারা প্রতিবেদন করা ARG_MAX
হয়েছে যার কার্নেলটি 3.13.0 বা কিছুটা ছোট 2088232 হিসাবে রিপোর্ট করা হয়েছে "আমরা সম্ভবত সর্বোচ্চ কমান্ডের দৈর্ঘ্য নির্ধারণ করতে পারি ব্যবহার " দ্বারাxargs --show-limits
এর আউটপুটটিতে এটি আপনার সিস্টেমে একবার দেখুন
getconf ARG_MAX
xargs --show-limits
অলসতা গাইডড সমাধান
এই জাতীয় ক্ষেত্রে আমি ব্লকগুলির সাথে কাজ করতে পছন্দ করি এমনকি কারণ সাধারণত একটি সময় দক্ষ সমাধান আসে।
যুক্তি (যদি থাকে তবে) আমি 1 ... 1000 1001..2000 ইত্যাদি ইত্যাদি লিখতে খুব অলসতা করছি ...
তাই আমি আমার কাছে এটির জন্য একটি স্ক্রিপ্ট চাই।
আমি আউটপুটটি যাচাই করার পরে কেবলমাত্র এটিই স্ক্রিপ্টে পুনর্নির্দেশ করব red
... তবে অলসতা একটি মনের অবস্থা ।
যেহেতু আমার অ্যালার্জি রয়েছে xargs
(আমার সত্যিই xargs
এখানে ব্যবহার করা উচিত ছিল ) এবং এটি কীভাবে ব্যবহার করতে হয় তা আমি চেক করতে চাই না, তাই আমি নীচের উদাহরণগুলির মতো চাকাটিকে পুনর্বিবেচনা করার জন্য যথাযথভাবে শেষ করি (tl; dr)।
নোট করুন যেহেতু ফাইলের নামগুলি নিয়ন্ত্রণ করা হয় (কোনও ফাঁকা জায়গা নয়, নতুন লাইনগুলি ...) আপনি নীচের স্ক্রিপ্টের মতো সহজেই যেতে পারেন can
TL; ড
সংস্করণ 1: alচ্ছিক পরামিতি হিসাবে 1 ম ফাইল নম্বর, শেষ, ব্লকের আকার, আউটপুট ফাইল হিসাবে পাস করুন
#!/bin/bash
StartN=${1:-1} # First file number
EndN=${2:-15000} # Last file number
BlockN=${3:-100} # files in a Block
OutFile=${4:-"all.pdb"} # Output file name
CurrentStart=$StartN
for i in $(seq $StartN $BlockN $EndN)
do
CurrentEnd=$i ;
cat $(seq -f file_%.17g.pdb $CurrentStart $CurrentEnd) >> $OutFile;
CurrentStart=$(( CurrentEnd + 1 ))
done
# Here you may need to do a last iteration for the part cut from seq
[[ $EndN -ge $CurrentStart ]] &&
cat $(seq -f file_%.17g.pdb $CurrentStart $EndN) >> $OutFile;
সংস্করণ 2
সম্প্রসারণের জন্য কল করা বাশ (আমার পরীক্ষাগুলিতে কিছুটা ধীর ~ 20%)।
#!/bin/bash
StartN=${1:-1} # First file number
EndN=${2:-15000} # Last file number
BlockN=${3:-100} # files in a Block
OutFile=${4:-"all.pdb"} # Output file name
CurrentStart=$StartN
for i in $(seq $StartN $BlockN $EndN)
do
CurrentEnd=$i ;
echo cat file_{$CurrentStart..$CurrentEnd}.pdb | /bin/bash >> $OutFile;
CurrentStart=$(( CurrentEnd + 1 ))
done
# Here you may need to do a last iteration for the part cut from seq
[[ $EndN -ge $CurrentStart ]] &&
echo cat file_{$CurrentStart..$EndN}.pdb | /bin/bash >> $OutFile;
অবশ্যই আপনি এগিয়ে যেতে পারেন এবং seq
[ 3 ] (কোর্টিল থেকে) সম্পূর্ণরূপে মুক্তি পেতে পারেন এবং ব্যাশের ভেরিয়েবলগুলির সাথে সরাসরি কাজ করতে পারেন, বা পাইথন ব্যবহার করতে পারেন বা এটি করার জন্য এসি প্রোগ্রাম সংকলন করতে পারেন [ 4 ] ...