কেন ওয়াইল্ড কার্ডের চরিত্র * কমান্ড জিপ এবং আরএম এর মধ্যে এত আলাদা?


58

আমার জন্য কিছু ফাইল অপারেশন করার জন্য আমি স্ক্রিপ্ট একসাথে রেখেছি। আমি *প্রকারের সমস্ত ফাইলগুলিতে ফাংশন প্রয়োগ করতে ওয়াইল্ড কার্ড অপারেটরটি ব্যবহার করছি , তবে একটি জিনিস পাওয়া যায় না। আমি unzipএই মত একটি ফোল্ডারে সমস্ত ফাইল করতে পারেন

unzip "*".zip

যাইহোক, পরে সমস্ত জিপ ফাইলগুলি সরিয়ে ফেলতে, আমাকে করা দরকার

rm *.zip

অর্থাৎ এটি উদ্ধৃতি চিহ্নগুলি চায় না। অন্যদিকে, আনজিপটি কার্যকর হয় না যদি আমি কেবল এটি * দেয় (আমাকে একটি সতর্কতা দেয় যে "ফাইলগুলি মেলেনি)"।

কেন এটি আলাদা? আমার কাছে এটি ঠিক একই ক্রিয়াকলাপের মতো বলে মনে হচ্ছে। বা আমি কি ওয়াইল্ড কার্ডটি ভুলভাবে ব্যবহার করছি?

ইউনিক্সের ওয়াইল্ড কার্ডের পরিচিতিগুলি সত্যিই এর মধ্যে যায় না এবং আমি rmবা zipডক্সে কিছুই সনাক্ত করতে পারি না ।

আমি একটি ম্যাক (ইয়োসেমাইট) এ টার্মিনালটি ব্যবহার করছি।


4
unzipসাধারণ for f in *.zip;do...doneশেল লুপ ব্যতীত এটি করার কোনও ধারণা আমার ছিল না । যেমন একটি অদ্ভুত নন-ইউনিক্স-মত কমান্ড লাইন UI।
পিটার কর্ডেস

@ পিটার আমি মনে করি আপনি পরিস্থিতি ভুল বুঝেছেন। unzipআর্কাইভের বিষয়বস্তুগুলিতে গ্লোব প্রয়োগ করে; আপনি এগুলিকে কোনও ওয়াইল্ডকার্ডের সাহায্যে পেতে পারেন না। (আপনি চ জন্য `প্রয়োজন চাই` unzip -l archive.zip; না ... done`)
Alexis

@ অ্যালেক্সিস: আমি unzipএকক জিপ ফাইলের মধ্যে গ্লোব গ্রহণ করার কথা জানতাম match তবে এটি ভিন্ন; আমি unzip '*.zip'একাধিক জিপ ফাইল সহ কোনও ডিরেক্টরিতে চেষ্টা করেছি এবং এটি সমস্ত জিপ থেকে সমস্ত ফাইল বের করে। যেমনটি আমি বলেছিলাম, অতি অদ্ভুত। tarএর মতো কোনও অপারেশন মোড নেই।
পিটার কর্ডেস

1
@ পিটার আমি দেখতে পেয়েছি ... হ্যাঁ এটি উদ্ভট, বিশেষত যেহেতু আনজিপ একাধিক কমান্ডলাইন যুক্তি গ্রহণ করবে না! পরিষ্কারভাবে একটি উইন্ডোজ-শুধুমাত্র বাস্তবায়ন। আমি কার্যটির ওপির বর্ণনার ভুল ব্যাখ্যা দিয়েছি।
Alexis

1
@ অ্যালেক্সিস: পিকেজিপ উইন্ডোজের প্রাক-তারিখগুলি । এটি একটি ডস কমান্ড-লাইন প্রোগ্রাম, ১৯৮৯ সালে প্রথম প্রকাশিত হয়েছিল Un
পিটার কর্ডেস

উত্তর:


69

আপনি পরিস্থিতিটি খুব ভালভাবে ব্যাখ্যা করেছেন। ধাঁধার শেষ চূড়ান্ত অংশটি হ'ল unzipওয়াইল্ডকার্ডগুলি নিজেই পরিচালনা করতে পারে:

http://www.info-zip.org/mans/unzip.html

যুক্তি

দায়ের [.zip]

...

ওয়াইল্ডকার্ড এক্সপ্রেশনগুলি সাধারণভাবে ব্যবহৃত ইউনিক্স শেলগুলিতে সমর্থিত (sh, ksh, csh) এর সমান এবং এতে থাকতে পারে:

* 0 বা ততোধিক অক্ষরের ক্রম মেলে

* ওয়াইল্ডকার্ডের উদ্ধৃতি দিয়ে, আপনি আপনার শেলটিকে প্রসারিত হতে বাধা দিয়েছেন, যাতে unzipওয়াইল্ডকার্ডটি দেখে এবং তার নিজস্ব যুক্তি অনুসারে এটি প্রসারিত করার বিষয়টি নিয়ে কাজ করে।

rmবিপরীতে, ওয়াইল্ডকার্ডগুলি নিজে থেকে সমর্থন করে না , সুতরাং একটি ওয়াইল্ডকার্ড উদ্ধৃত করার চেষ্টা করা rmপরিবর্তে ফাইলের নামটিতে আক্ষরিক নক্ষত্র অনুসন্ধান করার নির্দেশ দেবে।

unzip *.zipকাজ না করার কারণটি হল unzipএর বাক্য গঠনটি কেবল একাধিক জিপ ফাইলের জন্য অনুমতি দেয় না; যদি একাধিক প্যারামিটার থাকে তবে এটি দ্বিতীয় এবং পরবর্তী সংস্করণগুলি সংরক্ষণাগারে ফাইল হিসাবে প্রত্যাশা করে:

আনজিপ করুন [-Z] [-cflptTuvz [abjnoqsCDKLMUVWX $ /: ^]] ফাইল [.zip] [ফাইল (গুলি) ...] [-x xfile (গুলি) ...] [-d এক্সডির]


6
ধন্যবাদ, যে বোঝার! আমি যদি সঠিকভাবে বুঝতে পারি তবে এক ক্ষেত্রে আমি unzipনিজের ভাষায় কথা বলছি , অন্য ক্ষেত্রে সাধারণ ইউনিক্স লিঙ্গো?
প্যাট্রিক

6
সঠিক। আপনার শেলটি কী করে কোনও প্রোগ্রাম কী করে তা কী তা মনে রাখা গুরুত্বপূর্ণ।
জেফ স্ক্যালার হলেন

7
pkzip এর সূচনা ডস এর মাধ্যমে হয়েছিল যা প্রোগ্রামগুলিতে পাস করা ওয়াইল্ডকার্ডগুলি প্রসারিত করে না।
থোরবজর্ন রাভন অ্যান্ডারসন

11
@ পেট্রিক একটি প্রোগ্রামের সাহায্যে একাধিক ফাইল প্রসেস করার ইউনিক্স উপায় যা একবারে কেবল একটি ফাইলের সাথে কাজ করতে পারে তা হল একটি লুপ ব্যবহার করা। যেমন for f in *.zip ; do unzip -v "$f" ; done। এবং শেলটি ফাইলের নাম প্রসারণ ইত্যাদি কারণগুলির একটি বড় অংশটি প্রতিটি স্বতন্ত্র প্রোগ্রামের নিজের মতো না হওয়ার কারণ হয় (যার ফলে ওয়াইল্ডকার্ড সম্প্রসারণের স্বাধীনভাবে লিখিত প্রচুর পরিমাণে ছোট বা বিরক্তিকর উপায়ে পৃথক হতে পারে) ।
ক্যাস

24

এই দুটি কমান্ডের মধ্যে পার্থক্য হল উদ্ধৃত *অক্ষর। আপনি যদি শেলটিতে একটি কমান্ড কল করেন এবং একটি *আর্গুমেন্টের জন্য অক্ষরটি ব্যবহার করেন , শেল নিজেই যুক্তিটি মূল্যায়ন করবে। এই উদাহরণটি দেখুন:

$ ls
file1.zip  file2.zip  file3.zip  file4.txt

এখন একটি সহ *:

$ ls *.zip
file1.zip  file2.zip  file3.zip

শেলটি ওয়াইল্ডকার্ডকে মূল্যায়ন করে এবং নিম্নলিখিতভাবে একটি কমান্ড তৈরি করে:

$ ls file1.zip  file2.zip  file3.zip

উদ্ধৃত ওয়াইল্ডকার্ডের সাহায্যে এটি ফাইল (আক্ষরিক) হিসাবে ব্যাখ্যা করা হয় *.zip:

$ ls "*".zip
ls: cannot access *.zip: No such file or directory

unzipউপযোগ আর্গুমেন্ট হিসাবে একাধিক জিপ করা ফাইল বলা যায় না। তবে, বিকাশকারী এটির জন্য অন্য উপায় বেছে নিয়েছে। ম্যানপেজ থেকে:

দায়ের [.zip]

[...] ওয়াইল্ডকার্ড এক্সপ্রেশনগুলি সাধারণত ব্যবহৃত ইউনিক্স শেলগুলিতে সমর্থিত (sh, ksh, csh) এর অনুরূপ [...] ( অপারেটিং সিস্টেম দ্বারা অন্যথায় ব্যাখ্যা করা বা সংশোধিত হতে পারে এমন কোনও চরিত্রের উদ্ধৃতি দিতে ভুলবেন না , বিশেষত অধীনে ইউনিক্স এবং ভিএমএস।)


আপনি কি জানেন যে লেখকরা unzipএকাধিক জিপযুক্ত ফাইলকে যুক্তি হিসাবে মঞ্জুর করার পরিবর্তে কেন সেই রুটে যেতে বেছে নিয়েছিল?
ডেভিড এলটার

@ ডেভিডলেটর আমি খুব বেশি জানি না।
বিশৃঙ্খলা

1
আমি কেন বলতে পারি না, @ ডেভিডলেটর, তবে যেমন বিল্ট, আনজিপের সিনট্যাক্সগুলি জিপফাইলে যে ফাইলগুলি জিপফাইলের বিষয়বস্তু বলে মনে করা হয় তার পরে ফাইলের নাম গ্রহণ করে। আপনি দ্বিতীয় জিপ ফাইলটিকে "আমাকে আনজিপ করুন" পরামিতি বা "পূর্ববর্তী সংরক্ষণাগার থেকে এই অভ্যন্তরীণ জিপ ফাইলটি আনপ্যাক করুন" বোঝাতে চাইছেন কিনা তা দ্ব্যর্থহীন।
জেফ শ্যাচলার

@ ডেভিডলেটর জানেন না যে বিকাশকারীরা কী ভাবছিলেন, তবে সবকিছু তখন অনেক ধীর এবং ছোট ছিল । আপনি সাধারণত একবারে একাধিক জিপ ফাইল নিয়ে কাজ করতেন না। আপনার 90 বা 250 কেবি ফ্লপি ছিল এবং আপনি 10 এমবি ডিস্ক ড্রাইভ পেয়ে সত্যিই খুশি হন। জিনিসগুলি সংকুচিত করা হয়েছিল কারণ তাদের হতে হয়েছিল, কেবল আন্তঃব্যবস্থাপনার জন্য নয় for
জো

6

পার্থক্যটি প্রথম ক্ষেত্রে শেল নিজেই গ্লোবকে প্রসারিত করে:

% cd /                                                       
% echo *
Applications Library Network System Users Volumes bin cores ...
% 

দ্বিতীয় ক্ষেত্রে অ্যাপ্লিকেশন নিজেই কিছু করে ™ সেই আক্ষরিক চরিত্রের সাথে:

% cd /
% perl -E 'chdir "/tmp" or die; say for glob($ARGV[0])' "*"
com.apple.launchd.aj4FEhYqm5
...

যদি উদ্ধৃত না হয়, শেলটি প্রথমে গ্লোব প্রসারিত করে, এবং শেল গ্লোব যে পরিমাণে প্রসারিত হয়েছিল তা দিয়ে কমান্ডটি চালানো হবে।


2

শেল দ্বারা প্রক্রিয়া করার পরে একটি কমান্ড আর্গুমেন্টগুলি গ্রহণ করবে।

প্রথম প্রক্রিয়াকরণে, শেকলে একটি উদ্ধৃত স্থানকে *প্রসারিত করা হবে (প্যাটার্নের সাথে মেলে এমন ডিরেক্টরি (pwd) ফাইলগুলির তালিকায়):

echo *.zip

সমস্ত .zipফাইল তালিকাবদ্ধ করবে। কিন্তু echo "*".zip"হবে না

প্রথম প্রক্রিয়াকরণে, একটি উদ্ধৃতি "*"প্রসারিত হবে না, এটি প্যারামিটার হিসাবে আনজিপ কমান্ডকে দেওয়া হবে (উদ্ধৃতি সরিয়ে দেওয়ার পরে)। কমান্ড আনজিপ নিম্নলিখিত প্যারামিটার গ্রহণ করবে *.zip:

$ echo unzip "*".zip
unzip *.zip

এটি কমান্ড আনজিপ যা *ফাইলগুলির তালিকায় প্রসারিত করে ।


এটি আকর্ষণীয়ও যে এই দুটি কমান্ড সঠিক চূড়ান্ত ক্রিয়া সম্পাদন করবে না এবং কে *পরিবর্তনগুলি প্রসারিত করবে :

unzip "*".zip                ### the command unzip expands `*.zip`.
unzip *.zip                  ### the shell expands `*.zip`.

প্রথম কমান্ডটি এটি প্রাপ্ত করে *.zipযা এটি সমস্ত ফাইল প্রক্রিয়া করার জন্য প্রসারিত করে। দ্বিতীয় কমান্ড পিডব্লিউডিতে unzipসমস্ত .zipফাইলের একটি তালিকা পাবে , যা এটি প্রক্রিয়া করবে না, কারণ আনজিপ বিকাশকারী একাধিক zipফাইলের প্রসারণ প্রত্যাখ্যান করতে বেছে নিয়েছে ।


0

জিপটি একাধিক যুক্তি পরিচালনা করার জন্য কারণটির প্রয়োজন:

rm: যুক্তি তালিকার সমস্ত ফাইল সরান

zip: প্রথম যুক্তিতে ফাইলটি আনজিপ করুন। কেবলমাত্র বাকি আর্গুমেন্টে ফাইলগুলি এক্সট্রাক্ট করুন।

$ ls *.zip
file1.zip  file2.zip  file3.zip
$ unzip *.zip
Archive:  file1.zip
caution: filename not matched:  file2.zip
caution: filename not matched:  file3.zip

যেমন আপনি দেখতে পাচ্ছেন, এটি file1.zip এর মধ্যে file2.zip এবং file3.zip সন্ধান করার চেষ্টা করে

আপনাকে একসাথে একাধিক জিপ ফাইলগুলি বের করার অনুমতি দেওয়ার জন্য, জিপ একটি পৃথক ফলাফল সহ গ্লোবকে নিজেই ব্যাখ্যা করার পক্ষে সমর্থন করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.