সিপি: অনুলিপি ইউটিলিটির জন্য সর্বাধিক উত্স ফাইল নম্বর নম্বর


11

বিবেচনা করুন যে / src / এর আওতায় অসংখ্য সংখ্যক ফাইল রয়েছে

cp /src/* /dst/

cpসফলভাবে কতগুলি ফাইল প্রক্রিয়া করবে?


2
যদি আর্গুমেন্টের তালিকাটি দীর্ঘ হয় (মনে রাখবেন, * কী করে তা সমস্ত গ্লোবগুলির সাথে মেলে এমন সমস্ত ফাইলের তালিকায় প্রসারিত হয়), উদাহরণস্বরূপ আপনি এটি ব্যবহার করতে পারেন IFS="\n" for file in /src/*; do mv "$file" /dst/; doneবা rsync -a /src/ /dst/
ডোপঘোতি

উত্তর:


18

এটি সিস্টেম এবং সংস্করণ, আর্গুমেন্টের সংখ্যা এবং আকার এবং পরিবেশের পরিবর্তনশীল নামের সংখ্যা এবং আকারের উপর নির্ভর করে।

Ixতিহ্যগতভাবে ইউনিক্সে, সীমাটি (হিসাবে রিপোর্ট করা হয়েছে getconf ARG_MAX) কমবেশি আকারের কমবেশি ছিল:

  • আর্গুমেন্ট স্ট্রিংগুলির দৈর্ঘ্য (সমাপ্তি সহ '\0')
  • এই স্ট্রিংগুলিতে পয়েন্টারের অ্যারের দৈর্ঘ্য, তাই সাধারণত একটি 64 বিট সিস্টেমে 8 টি বাইট আর্গুমেন্ট
  • পরিবেশের স্ট্রিংগুলির দৈর্ঘ্য (সমাপ্তি সহ '\0'), একটি পরিবেশের স্ট্রিং যা কনভেনশন অনুসারে কিছু var=value
  • এই স্ট্রিংগুলিতে পয়েন্টারের অ্যারের দৈর্ঘ্য, তাই সাধারণত একটি 64 বিট সিস্টেমে 8 টি বাইট আর্গুমেন্ট

মনে রাখা যে cpআর্গুমেন্ট হিসাবে গণনা করা হয় (প্রথম যুক্তি)।

লিনাক্সে, এটি সংস্করণে নির্ভর করে। সেখানকার আচরণটি সম্প্রতি পরিবর্তিত হয়েছিল যেখানে এটি কোনও স্থির জায়গা নয়।

লিনাক্স ৩.১১-এ চেক করা getconf ARG_MAXএখন স্ট্যাকের আকারের উপর নির্ধারিত সীমাটির এক চতুর্থাংশ বা 512kiB এর চেয়ে কম যদি 128kiB রিপোর্ট করে)।

( zshনীচের বাক্য গঠন):

$ limit stacksize
stacksize       8MB
$ getconf ARG_MAX
2097152
$ limit stacksize 4M
$ getconf ARG_MAX
1048576

এই সীমাটি আর্গুমেন্ট এবং পরিবেশের স্ট্রিং এবং কিছু ওভারহেডের সংমিশ্রণ আকারে (পৃষ্ঠা সীমানায় প্রান্তিককরণ বিবেচনার কারণে আমি সন্দেহ করি)। পয়েন্টার আকার বিবেচনা করা হয় না।

সীমাটি অনুসন্ধান করে, আমি পেয়েছি:

$ /bin/true {1..164686}
$ /bin/true {1..164687}
zsh: argument list too long: /bin/true
$ x= /bin/true {1..164686}
$ x=1 /bin/true {1..164686}
zsh: argument list too long: /bin/true

সেক্ষেত্রে ব্রেক করার আগে সর্বাধিক সংখ্যার আকার:

$ (env _=/bin/true x=;print -l /bin/true {1..164686}) | wc -c
1044462

এখন, এর অর্থ এই নয় যে আপনি 1 মিলিয়ন খালি যুক্তি পাস করতে পারবেন। একটি 64 বিট সিস্টেমে, 1 মিলিয়ন খালি যুক্তিগুলি 8MB এর পয়েন্টার তালিকা তৈরি করে, যা আমার স্ট্যাক আকার 4MiB এর ওপরে হবে।

$ IFS=:; /bin/true ${=${(l.1000000..:.)${:-}}}
zsh: killed     /bin/true ${=${(l.1000000..:.)${:-}}}

(আপনি লক্ষ্য করেছেন এটি কোনও E2BIG ত্রুটি নয় I'm আমি নিশ্চিত নই যে প্রক্রিয়াটি কোন পর্যায়ে সেখানে মারা যায় যদিও এটি execveসিস্টেম কলের বা তার পরে থাকলে)।

এছাড়াও লক্ষ করুন (এখনও লিনাক্স 3.11 এ) একটি একক যুক্তি বা পরিবেশের স্ট্রিংয়ের সর্বাধিক আকার 128kiB, স্ট্যাকের আকার নির্বিশেষে।

$ /bin/true ${(l.131071..a.)${:-}} # 131072 OK
$ /bin/true ${(l.131072..a.)${:-}} # 131073 not
zsh: argument list too long: /bin/true
$ /bin/true ${(l.131071..a.)${:-}} ${(l.131071..a.)${:-}} # 2x 131072 OK

আপনি কি ভাগ করে নিতে পারেন, আপনি কিভাবে 164686নম্বর নিয়ে এসেছেন ? অর্থাৎ আপনি কীভাবে গণনা করলেন যে ক্রমটি 2097152ARG_MAX আকারের অধীনে থাকবে?
সের্গেই কলডিয়াজন্য

14

এটি ARG_MAX এর মানের উপর নির্ভর করবে যা সিস্টেমের মধ্যে পরিবর্তন করতে পারে। আপনার সিস্টেমে রান করার মান জানতে (উদাহরণ হিসাবে আমার উপর ফলাফলটি দেখানো):

$ getconf ARG_MAX
2097152

এটির সাথে cpবা আপনার শেলের কোনও সম্পর্ক নেই , এটি কার্নেলের দ্বারা আরোপিত একটি সীমা, exec()তাদের আর্গুমেন্ট দীর্ঘ না হলে এটি ( ) আদেশগুলি কার্যকর করবে না ARG_MAX। সুতরাং, আপনি যে আর্গুমেন্ট তালিকার দৈর্ঘ্য দিয়েছেন তা cpযদি ARG_MAX এর চেয়ে বেশি হয় তবে cpকমান্ডটি মোটেও চলবে না।

আপনার মূল প্রশ্নের উত্তর দেওয়ার জন্য, cpকোনও ফাইল প্রক্রিয়া করবে না কারণ এটি এত যুক্তি দিয়ে কখনই কার্যকর করা হবে না। আমার আরও উল্লেখ করা উচিত যে এটি আর্গুমেন্টের সংখ্যার উপর নির্ভর করে না তবে তাদের দৈর্ঘ্যের উপর নির্ভর করে। খুব কম তবে খুব দীর্ঘ ফাইলের নাম নিয়ে আপনার একই ধারণা থাকতে পারে।


এই ত্রুটিগুলি সম্পর্কে জানার উপায়টি হ'ল আপনার কমান্ডটি একটি লুপে চালানো:

for file in /src/*; do cp "$file" /dst/; done

এর অর্থ কি এই যে নীচের স্তরের ভাষাগুলিতেও Cএআরজি_এমএক্স এবং সত্যই দীর্ঘ ফাইলের নামগুলির সাথে সমস্যা থাকতে পারে?
হ্যারল্ড ফিশার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.