Ls সবসময় rm মুছে ফেলা হবে এমন ফাইলগুলির তালিকা তৈরি করবে?


33

আমার মনে হয় এমন কিছু যা আমার নিশ্চিতভাবে জানা উচিত: যদি আমি ls <something>, প্রদর্শিত rm <something>একই ফাইলগুলি সরিয়ে ফেলব ls? এমন কোনও পরিস্থিতি রয়েছে যেখানে প্রদর্শিত না হওয়া rmফাইলগুলি সরিয়ে ফেলতে পারে ls? (এটি 18.04 বাশে রয়েছে)

সম্পাদনা করুন: প্রত্যুত্তর দেওয়া প্রত্যেককে ধন্যবাদ। আমি মনে করি পুরো উত্তরটি সমস্ত উত্তরগুলির সংমিশ্রণ, সুতরাং আমি সর্বাধিক ভোট প্রাপ্ত উত্তরটিকে "উত্তর" হিসাবে গ্রহণ করেছি।

পথে অপ্রত্যাশিত জিনিস আমি শিখেছি:

  • ls আপনি এর আর্গুমেন্টগুলি পরিচালনা করার ক্ষেত্রে যতটা সহজ ভাবতে পারেন তেমন সহজ নয়
  • উবুন্টু, .bashrc উপকরণের একটি সরল আন-ফিডড-ইনস্টল ইন ls
  • আপনার ফাইলগুলির নাম কোনও ড্যাশ দিয়ে শুরু করবেন না কারণ তারা কমান্ড আর্গুমেন্টের মতো দেখতে পারে এবং এক-আর এর নাম জিজ্ঞাসা করছে!

8
আমি কিছুটা অবাক হলাম rmএকটি নেই --dry-runপতাকা ...
fkraiem

20
@ রিনজুইন্ড এর find -deleteচেয়ে ভাল হবে কেন rm? আপনি "সে কারণেই" বলছেন তবে এটি আমার কাছে সম্পূর্ণ অস্পষ্ট। এছাড়াও নোট করুন যে আপনার findঅনুরোধটি বর্তমান ডিরেক্টরিতে পুনরাবৃত্তভাবে সমস্ত ফাইল মুছে ফেলবে , যেখানে rmকেবল তাত্ক্ষণিক ডিরেক্টরিতে থাকা ফাইলগুলি মুছবে। এছাড়াও -name *একটি অপশন আছে। সব মিলিয়ে, আমি আপনার পরামর্শ শুনে বেশ
আশ্চর্য হয়েছি

3
@ মার্কসেল আমার মনে হয় ব্যবহারের পরামর্শটি findহ'ল কারণ আপনি এটি চালাতে, সমস্ত ফাইল দেখতে এবং তারপরে একই কমান্ডটি চালাতে পারেন -delete। যেহেতু আপনি ইতিমধ্যে ফলাফলগুলি দেখেছেন find, তাই কী সরানো হবে সে সম্পর্কে কোনও দ্বিধা নেই should (আমি আসলে একটি উত্তর আকারে এ সম্পর্কে আরও বিস্তারিত শুনতে চাই)
স্ক্রিবলমাচার

5
@ গ্রাহকমাচার "... আপনি এটি চালাতে পারেন, সমস্ত ফাইল দেখতে এবং তারপরে একই কমান্ড চালাতে -delete" - তবে এটি চালানোর চেয়ে কীভাবে ভাল ls <filespec>, এরপরে rm <filespec>(যা ওপি ইতিমধ্যে কীভাবে করতে পারে তা জানে)?
মার্সেলেম

12
@ রিনজুইন্ড "এটি তাত্ক্ষণিকের জন্য চোরোবার উত্তর সলভ করে যেখানে এলএস এর পরে এবং আরএম এর আগে একটি ফাইল তৈরি করা হয়।" - না, তা হয় না। find ... -printকোন ফাইলগুলি মুছে ফেলা হবে তা নিশ্চিত করতে আপনি যদি প্রথমে চালান এবং তারপরে find ... -delete, আপনি এখনও দুটি কমান্ডের মধ্যে তৈরি ফাইলগুলি মুছবেন। যদি আপনি উভয়ই ব্যবহার করেন -printএবং -delete, আপনি নিশ্চয়তা পান না, যা মুছে ফেলা হয়েছে তার সত্যিকারের একটি রিপোর্ট (এবং আপনি সম্ভবত এটি ব্যবহার করতে পারেন rm -v)।
মার্সেলেম

উত্তর:


40

ভাল, উভয় lsএবং rmতাদের কাছে প্রেরিত আর্গুমেন্টগুলি পরিচালনা করুন।

এই আর্গুমেন্ট একটি সহজ ফাইল তাই হতে পারে, ls file.extএবং rm file.extএকই ফাইলে কাজ এবং পরিণতি স্পষ্ট (তালিকা ফাইল / ফাইল মুছে)।

পরিবর্তে আর্গুমেন্ট যদি কোনও ডিরেক্টরি হয় তবে ডিরেক্টরিটির সামগ্রীটিls directory তালিকাভুক্ত করে যেমন কাজ করবে না (যেমন পতাকা ছাড়া ডিরেক্টরিগুলি সরিয়ে ফেলতে পারে না, আপনি যদি করেন তবে এটি পুনরুক্তরূপে সমস্ত ফাইল মুছে ফেলা হয় এবং ডিরেক্টরিটি নিজেই )।rm directoryrmrm -r directorydirectory

তবে মনে রাখবেন যে কমান্ড লাইন আর্গুমেন্টগুলি শেল প্রসারণের শিকার হতে পারে , সুতরাং ওয়্যার্ডকার্ডস, ভেরিয়েবলগুলি, অন্যান্য কমান্ডের আউটপুট ইত্যাদিতে যদি একই আর্গুমেন্ট উভয় কমান্ডের কাছে প্রেরণ করা যায় তা সর্বদা গ্যারান্টিযুক্ত নয়

চরম উদাহরণ হিসাবে মনে করুন ls $(rand).txtএবং rm $(rand).txt, যুক্তিগুলি "একই" তবে ফলাফলগুলি একেবারেই আলাদা!


3
এছাড়াও বিবেচনা lsবনাম rm *যেখানে "লুকানো" হয় (ডট) ফাইল, যদিও এমনকি সব ন্যায্য তুলনা না এর যে হিসাবে আমি লিখিনি এ ls *। তবে rmএটি নিজস্ব অর্থহীন তাই পুরো জিনিসটি সত্যই আপেল এবং কমলা। যদি আমি সঠিকভাবে বুঝতে পারি তবে এটি আপনার উত্তরটির
শিষ্টাচার

5
lsবনাম সম্পর্কে আরও একটি মন্তব্য rm -r: কমান্ড ls <directory>ডিরেক্টরিটির ভিতরে লুকানো ফাইলগুলি প্রদর্শন করবে না, তবে লুকানো ফাইলগুলিও মুছে rm -r <directory> ফেলবে
ড্যানিয়েল ওয়াগনার

1
@ লাইটনেসেসিনঅরবিট lsতাদের তালিকাভুক্ত করবে না (যদি না এটির সাথে সম্পর্কিত হয় ls -a) rm *তবে এগুলি মুছবে না (যদি না আপনি dotglobসেট না করেন)।
মনিকার ক্ষতি করা বন্ধ করুন

20

আপনি যদি ls foo*.txtবনামের মতো কিছু ভাবছেন rm foo*.txtতবে হ্যাঁ, তারা একই ফাইলগুলি প্রদর্শন করবে এবং সরিয়ে দেবে। শেলটি গ্লোবকে প্রসারিত করে, এবং এটি প্রশ্নাবলীতে কমান্ডে প্রেরণ করে এবং কমান্ডগুলি তালিকাভুক্ত ফাইলগুলিতে কাজ করে। একটি তাদের তালিকা, একটি তাদের অপসারণ।

স্পষ্টত পার্থক্য হ'ল যদি এই ফাইলগুলির মধ্যে কোনও ডিরেক্টরি হয়ে থাকে তবে lsতার বিষয়বস্তু rmতালিকাবদ্ধ করে তবে এটি সরিয়ে ফেলতে ব্যর্থ হবে। এটি সাধারণত কোনও সমস্যা নয় কারণ যেটি দেখানো হয়েছে তার চেয়ে কমrm সরিয়ে ফেলবে ।ls

এখানে বড় সমস্যাটি চালানো থেকেls * বা ড্যাশ দিয়ে শুরু হওয়া ফাইলের নামrm * সম্বলিত ডিরেক্টরিতে আসে । তাঁদের দুটি প্রোগ্রামের কমান্ড লাইন প্রসারিত হবে যেন আপনি তাদের নিজেকে লিখেছে, এবং গ্রহণ করা হবে সময়, মানে "বিপরীত সাজানোর ক্রম" গ্রহণ করা হবে একটি recursive অপসারণ মানে। আপনার যদি কমপক্ষে দুটি স্তর গভীর করে উপ-ডিরেক্টরি থাকে তবে পার্থক্যটি গুরুত্বপূর্ণ। ( প্রথম স্তরের ডিরেক্টরিগুলির বিষয়বস্তু প্রদর্শন করা হবে, তবে সমস্ত কিছু প্রথম সাবলিলও পেরিয়ে যাবে))ls-rrm-rls *rm -r *

এটি এড়াতে, ./বর্তমান ডিরেক্টরিটি নির্দেশ করতে একটি শীর্ষস্থানীয় সহ অনুমতিযুক্ত গ্লোব লিখুন এবং / অথবা গ্লোব --(অর্থাৎ rm ./*বা rm -- *) এর আগে বিকল্প প্রক্রিয়াকরণের সমাপ্তির সংকেত দিতে একটি চাপ দিন ।

গ্লোব জাতীয় মত *.txt, এটি আসলে কোনও সমস্যা নয় যেহেতু বিন্দুটি একটি অবৈধ বিকল্প চরিত্র, এবং এটি একটি ত্রুটি সৃষ্টি করবে (যতক্ষণ না কেউ এর অর্থ বোঝার জন্য ইউটিলিটিগুলি প্রসারিত না করে) তবে ./যাইহোক এটি সেখানে রাখা আরও নিরাপদ ।


অবশ্যই যদি আপনি শেলের গ্লোব্বিং বিকল্পগুলি পরিবর্তন করেন, বা কমান্ডগুলির মধ্যে ফাইল তৈরি / সরিয়ে / মুছে ফেলা হয়ে থাকেন তবে আপনি দুটি কমান্ডের জন্য পৃথক ফলাফল পেতে পারেন তবে আমি সন্দেহ করি যে আপনি সেগুলির কোনও একটি বোঝাতে চেয়েছিলেন। (নতুন / সরানো ফাইলগুলির সাথে ডিল করা নিরাপদে নিরাপদে করার পক্ষে চূড়ান্ত y


1
ধন্যবাদ. এটি পুরো কমান্ড লাইন সিনট্যাক্সের সাথে কোনও সমস্যা হাইলাইট করে বলে মনে হচ্ছে: আপনি যদি কোনও ড্যাশ দিয়ে শুরু করা ফাইলগুলির নাম দেন তবে আপনি বিপজ্জনক জলে যাত্রা করছেন। ফাইলগুলি ভুলে যাওয়ার অনেক পরে আপনি ভবিষ্যতে কোন আদেশগুলি ব্যবহার করতে পারেন কে জানে।
বি.ট্যানার

1
@ বি ট্যানার, হ্যাঁ এক অর্থে, সমস্যাটি হ'ল কমান্ড লাইন আর্গুমেন্টগুলি কেবল সরল স্ট্রিং। যদি সিস্টেমটি আজ ডিজাইন করা হত তবে এর মধ্যে আরও কাঠামো থাকতে পারে যাতে মৃত্যুদন্ড কার্যকর হওয়া প্রোগ্রামটি জানতে পারে যে কোনও যুক্তিটি বিকল্পের পতাকা হিসাবে বিবেচিত হবে কিনা। এছাড়াও অন্যান্য সমস্যাগুলি রয়েছে যা ফাইল নামগুলির খুব শিথিল কাঠামো থেকে আসে। দ্বিহিলার দ্বারা এটি একটি খুব গভীর রচনা আছে, কিন্তু আমি সতর্ক করতে হবে যে এটি পড়তে ক্ষতি হতে চলেছে। (হয় বিশদ থেকে, বা কী কী ভুল হতে পারে তার
একদম উদ্বেগ থেকে

3
আমি প্রতিরোধ করতে পারছি না, আপনি এটি আমার কাছে বিক্রি করে দিয়েছিলেন, আমি এখন এটি পড়তে গিয়েছি, প্রচুর ফাইলের নাম শেষে ক্যারেজ রিটার্ন চরিত্র পাওয়ার জন্য যে সময়ের স্মৃতি ছিল (আমি চেষ্টা করতে পারি কিনা তা দেখার চেষ্টা করছি) একটি উইন্ডোজ ব্যাচ ফাইল তৈরি করুন যা বাশ স্ক্রিপ্ট হিসাবে চালাতে পারে ... আমি দেখিনি যে এটি আসছে!)
বি ট্যানার

17

শেলের আচরণকে বাদ দিয়ে আসুন কেবল কী rmএবং lsনিজেরাই কীভাবে ডিল করতে পারেন সেদিকে মনোযোগ দিন । কমপক্ষে একটি ক্ষেত্রে যেখানে প্রদর্শিত lsহবে যা যা rmসরিয়ে ফেলতে পারে না তার মধ্যে ডিরেক্টরি অনুমতিগুলি অন্তর্ভুক্ত থাকে এবং অন্যটি - বিশেষ ডিরেক্টরি .এবং ..

ফোল্ডারের অনুমতি

rmডিরেক্টরিতে থাকা একটি ক্রিয়াকলাপ, কারণ কোনও ফাইল অপসারণ করে আপনি ডিরেক্টরি বিষয়বস্তু পরিবর্তন করতে পারেন (বা অন্য কথায় ডিরেক্টরি এন্ট্রিগুলির তালিকা, যেহেতু ডি ডিরেক্টরী ফাইলের নাম এবং ইনোডের তালিকা ছাড়া আর কিছুই নয় )। এর অর্থ আপনার কোনও ডিরেক্টরিতে লেখার অনুমতি প্রয়োজন। এমনকি আপনি যদি ফাইলের মালিক হন তবে ডিরেক্টরি অনুমতি ছাড়াই আপনি ফাইলগুলি সরাতে পারবেন না। বিপরীতটিও সত্য : rmফাইল অন্যান্যের মালিকানাধীন হতে পারে যদি আপনি ডিরেক্টরি মালিক অপসারণ করতে পারেন।

সুতরাং আপনি খুব ভালভাবে একটি ডিরেক্টরিতে অনুমতিগুলি পড়তে এবং সম্পাদন করতে পারেন যা আপনাকে ডিরেক্টরিটি অতিক্রম করতে এবং উদাহরণস্বরূপ সূক্ষ্মরূপে সামগ্রীগুলি দেখতে দেয়, উদাহরণস্বরূপ ls /bin/echo, তবে আপনি rm /bin/echoযদি /bin আপনার অধিকারগুলির মালিক না হন বা উন্নত না করেন তবে আপনি পারবেন না sudo

এবং আপনি সর্বত্র এই জাতীয় কেস দেখতে পাবেন। এই জাতীয় একটি কেস এখানে দেওয়া হয়েছে: https://superuser.com/a/331124/418028


বিশেষ ডিরেক্টরি '।' এবং '..'

আর একটি বিশেষ কেস .এবং ..ডিরেক্টরিগুলি। আপনি যদি করেন ls .বা করেন তবে ls ..এটি আনন্দের সাথে আপনাকে সামগ্রীগুলি দেখিয়ে দেবে, তবে rmসেগুলিতে প্রবেশের অনুমতি নেই:

$ rm -rf .
rm: refusing to remove '.' or '..' directory: skipping '.'

15

আপনি যদি টাইপ করেন ls *এবং তারপরে rm *এটি সম্ভব হয় আপনি প্রদর্শিত ফাইলের চেয়ে আরও বেশি ফাইল সরিয়ে lsফেলবেন - সেগুলি সম্ভবত শেষের lsএবং প্রারম্ভের মধ্যে ক্ষুদ্র সময়ের ব্যবধানে তৈরি করা হয়েছিল rm


1
এটি একটি সম্ভাব্য কেস /tmp, যেখানে অনেক অ্যাপ্লিকেশন অস্থায়ী ফাইল তৈরি করতে পারে, তাই এটি উভয় কমান্ডের মধ্যে সর্বদা একটি সম্ভাবনা *। যাইহোক, কিছু অ্যাপ্লিকেশনগুলি unlink()ফাইল হ্যান্ডেলটি উন্মুক্ত রাখার সময় ফাইলগুলিকে আইএন দিয়ে বেনামে তৈরি করে , যাতে এটি প্রদর্শিত হতে পারে ls *তবে rm *এটি ধরতে পারে না।
সের্গেই কলডিয়াজনি

1
@ ওরেঞ্জডগ আপনি পয়েন্টটি মিস করছেন। আমরা বর্ণের অবস্থার বিষয়ে কথা বলছি
সের্গি কলডিয়াজহনি

1
@ অরেঞ্জডগ আমাকে এখনই ফোনে থাকাকালীন এটি যাচাই করতে হবে, তবে পয়েন্টটি এখনও *কী প্রদর্শিত lsহবে এবং কী rmকাজ করবে তার মধ্যে পার্থক্য থাকা সত্ত্বেও দাঁড়িয়ে আছে কারণ ডিরেক্টরি সামগ্রীর তালিকাগুলির তালিকা বদলেছে।
সের্গেই কলডিয়াজনি 16

1
এমনকি যদি আপনি কেবল একটি আদেশ করেন তবে আর্গুমেন্টগুলি প্রসারিত করার এবং সেগুলি মোছার মধ্যে একটি রেস শর্ত রয়েছে।
মনিকা মনিকা বন্ধ করুন

1
@ ওরেঞ্জডগ আমি এর সাথে একমত হতে পারি ওয়াইল্ডকার্ড সম্প্রসারণ বিদ্যমান ফাইলের নামগুলিতে যেমন কাজ করে, হ্যাঁ, ওয়াইল্ডকার্ড প্রসারিত শেল এবং একটি কমান্ড এটির প্রক্রিয়া করার মধ্যে একটি দৌড়ের শর্ত রয়েছে, সুতরাং ls *প্রকৃতপক্ষে যে ফাইল ফাইলটি গেছে তা দেখাতে পারে।
সের্গেই কলডিয়াজনি 16

9

ls *এবং rm *গ্লোব সম্প্রসারণের জন্য দায়ী নয় - এটি কমান্ডে যাওয়ার আগে শেল দ্বারা সম্পন্ন হয়।

এর অর্থ হ'ল আপনি প্রসারিত ফাইললিস্ট সহ যে কোনও কমান্ড ব্যবহার করতে পারবেন - তাই আমি এমন কিছু ব্যবহার করব যা যতটা সম্ভব সম্ভব হয়।

সুতরাং এটি করার একটি ভাল উপায় (বা কমপক্ষে, অন্য উপায়) মাঝারি মানুষটিকে এড়িয়ে যাওয়া।

echo *আপনার rmআদেশে যা পাস হবে তা আপনাকে ঠিক দেখাবে ।


2
আপনাকে ধন্যবাদ, আমি এই দৃশ্যে এল এর পরিবর্তে প্রতিধ্বনি ব্যবহার করার ধারণা পছন্দ করি।
বি.ট্যানার

3
অথবা printf "%s\n" *স্পেস সহ ফাইলের নামগুলিতে একটি দ্ব্যর্থহীন দর্শন পেতে। (অথবা %qপরিবর্তে
কুশলী

4

কেমন:

$ mkdir what
$ cd what
$ mkdir -p huh/uhm ./-r
$ ls *
uhm
$ rm *
$ ls
-r
$ ls -R
.:
-r

./-r:

মূলত শুরু করা স্টাফগুলিতে প্রসারিত ওয়াইল্ডকার্ডগুলি -(বা ম্যানুয়ালি প্রবেশ করা জিনিসগুলি দিয়ে শুরু করা হয়েছে -তবে এটি কিছুটা প্রতারণার মতো দেখায়) এর দ্বারা lsএবং আলাদাভাবে ব্যাখ্যা করা যেতে পারে rm


4

সেখানে হয় প্রান্ত ক্ষেত্রে যেখানে কি lsশো কি নয় rmসরিয়ে ফেলা হয়। বরং চূড়ান্ত, তবে সৌভাগ্যক্রমে সৌম্যরূপে যদি আপনি পাস lsকরেন তর্কটি একটি ডিরেক্টরিতে প্রতীকী লিঙ্ক হয়: সিমলিংকড ডিরেক্টরিতে থাকা সমস্ত ফাইল আপনাকে দেখায়, যখন rmমূল ডিরেক্টরিটি এবং এর বিষয়বস্তুগুলি আটকানো না রেখে সিমলিংকটি সরিয়ে দেবে:

% ln -s $HOME some_link
% ls some_link    # Will display directory contents  
bin    lib    Desktop ...
% rm some_link
% ls $HOME
bin    lib    Desktop ...

1
হাহ। আমার জন্য ln -s $HOME some_link; ls some_linkআউটপুট some_link@, কিন্তু আমি lsএলিয়াস করেছি ls -F। স্পষ্টতই, -Fলিঙ্কটিকে ডিফেরেন্স করার পরিবর্তে আচরণটি পরিবর্তন করে। আশা করিনি।
মার্সেলেম

প্রকৃতপক্ষে! এছাড়াও ls -lউদাহরণস্বরূপ লিংকটিকে লক্ষ্য করে, গন্তব্য নয় ... লিঙ্কটি নিজেই পরীক্ষা করার উপায় থাকতে হবে।
অ্যালেক্সিস

1
প্রশ্নের অপশন যোগ করার পদ্ধতি অনেকগুলি খুলে possibilities-- আমার উত্তর এর অপরিবর্তিত আচরণ সম্পর্কে lsএবং rm
অ্যালেক্সিস

আপনি যদি বলেন ls some_link/,  ls -H some_linkবা ls -L some_link, এটি লিঙ্ক-টু ডিরেক্টরিটি তালিকাভুক্ত করবে, এমনকি আপনি যুক্ত করলেও -Fবা -l। বিপরীতভাবে (সাজান অফ), -dএকটি ডিরেক্টরি এর বিষয়বস্তু পরিবর্তে তাকান বলে; তুলনা ls -l /tmpএবং ls -ld /tmp
জি-ম্যান

অবশ্যই, আপনি এমন পতাকাগুলি যুক্ত করতে পারেন যা এর আচরণ পরিবর্তন করে ls। আপনি মূলত দেখিয়ে দিচ্ছেন যে বিভিন্ন পতাকা নিয়ে আচরণগুলি গণনা করা কেন এই প্রশ্নের জন্য বিরক্তিকর নয় ...
অ্যালেক্সিস

4

আপনি যদি কেবল lsতার পরিবর্তে করেন তবে ls -aহ্যাঁ rmআপনি লুকানো ফাইলগুলি সরিয়ে ফেলতে পারেন যা আপনি lsছাড়া দেখেন নি -a

উদাহরণ:

অনুসারে :

dir_test
├── .test
└── test2

ls dir_test : কেবল টেস্ট 2 প্রদর্শন করবে

ls -A dir_test : পরীক্ষা 2 + .টেস্ট প্রদর্শিত হবে

rm -r dir_test : সমস্ত (.টেস্ট + টেস্ট 2) সরিয়ে দেবে

আমি আশা করি যে আপনাকে সাহায্য করবে।


আপনি একটি উদাহরণ প্রদান করতে পারেন? কারণ সাধারণত, rm *ডটফাইলগুলি সরান না। এটি যদি করে তবে ls *সেগুলিও প্রদর্শন করবে।
মার্সেলেম

না, ls *লুকানো ফাইলগুলি প্রদর্শন করবেন না।
দেবহাগো

তবে হ্যাঁ এটি কিছুটা বিভ্রান্ত, আমি কয়েকটি উদাহরণ যুক্ত করেছি।
DevHugo

1
ls -aতালিকা প্রস্তুত করা যাবে ., .., .testএবং test2। আপনি ব্যবহার করতে আপনার উদাহরণ পরিবর্তন করতে চাইতে পারেন ls -A, যা তালিকা সবকিছু ব্যতীত . এবং ..(অর্থাত, শুধুমাত্র .testএবং test2)।
জি-ম্যান 22 'এ 22

3

ইতিমধ্যে অনেক ভাল উত্তর আছে, তবে আমি আরও কিছু গভীর অন্তর্দৃষ্টি যুক্ত করতে চাই।

নিজেকে প্রশ্ন জিজ্ঞাসা করুন: lsআপনি লিখলে কতটি পরামিতি পাস হয় passed

ls *

...? নোট করুন যে lsকমান্ডটি প্রসারিত করার মতো *কোনও ফাইল থাকলে প্যারামিটারটি পায় না *। পরিবর্তে, শেলটি কমান্ডটি চালানোর আগে প্রথমে গ্লোব্বিং করে, সুতরাং lsকমান্ডটি যতটা পরামিতি পেতে পারে সেখানে গ্লোব্বিংয়ের সাথে মিলে যাওয়া ফাইলগুলি রয়েছে। গ্লোব্বিং দমন করতে, প্যারামিটারটি উদ্ধৃত করুন।

এটি কোনও আদেশের ক্ষেত্রে সত্য: echo *বনাম echo '*'

স্ক্রিপ্ট আছে, এফেক্টটি countparams.shপরীক্ষা করার জন্য এটি কল করুন । এটি আপনাকে জানায় যে এটি কতগুলি পরামিতিগুলি পেরিয়ে গেছে এবং সেগুলি তালিকাভুক্ত করে।

#!/bin/bash
echo "This script was given $# parameters."
arr=( "$@" )
for ((i=0;i<$#;i++)); do
        echo "Parameter $((i+1)): ${arr[$i]}"
done

এটাকে এক্সিকিউটেবল করে চালান ./countparams.sh *। এর আউটপুট থেকে শিখুন!


1

গ্লোব উভয় সময় একইভাবে প্রসারিত হবে, যদি সেই দুটি ভিন্ন সময়ে ডিরেক্টরি বিষয়বস্তু একই থাকে।


আপনি যদি সত্যিই কী অপসারণ করবেন তা পরীক্ষা করতে চান তবে ব্যবহার করুন rm -i *.txt। এটি আপনাকে মুছে ফেলার আগে (চেষ্টা করার) আগে প্রতিটি ফাইলের জন্য আলাদাভাবে অনুরোধ জানাবে।

এটি জাতির শর্তগুলির বিরুদ্ধে সুরক্ষিত থাকার গ্যারান্টিযুক্ত:
        ls *.txt/ একটি নতুন ফাইল তৈরি করা হয়েছে / rm *.txt
কারণ আপনাকে একই ফাইলের দ্বারা প্রতিটি ফাইলের জন্য অনুরোধ করা হচ্ছে যা অপসারণ করছে।


এই স্বাভাবিক ব্যবহারের জন্য খুব কষ্টকর হয়, এবং যদি আপনি ওরফে rmকরতে rm -i, আপনি নিজেকে ব্যবহার পাবেন \rmবা rm -fমোটামুটি প্রায়ই। তবে এটি অন্তত উল্লেখ করার মতো যে রেসের শর্তের একটি সমাধান রয়েছে। (এটি নন-জিএনইউ সিস্টেমে পোর্টেবলও রয়েছে: পসিক্স বিকল্পটি rm(1)নির্দিষ্ট করে-i )

অন্য বিকল্পটি হ'ল ব্যাশ অ্যারে:, to_remove=(*.txt)তারপরে ব্যবহারকারীকে নিশ্চিত করতে (সম্ভবত করার পরে ls -ld -- "${to_remove[@]}") জিজ্ঞাসা করুন rm -- "${to_remove[@]}"। সুতরাং গ্লোব সম্প্রসারণ কেবল একবার করা হয়, এবং তালিকাটি ভার্বাটিমে পাস করা হয় rm

ব্যবহারিকভাবে ব্যবহারযোগ্য অন্য একটি বিকল্প হ'ল জিএনইউ rm -I( ম্যান পৃষ্ঠা ), যা 4 টিরও বেশি আইটেম সরিয়ে ফেললে অনুরোধ জানায়। (তবে আপনাকে তালিকাটি দেখায় না, কেবল মোট।) আমি alias rm='rm -I'আমার ডেস্কটপে ব্যবহার করি।

এটি অর্ধ-টাইপযুক্ত প্যাটার্নের সাথে ফ্যাট-ফিঙ্গারিং রিটার্নের বিরুদ্ধে দুর্দান্ত সুরক্ষাকারী যা খুব বেশি মেলে। তবে lsপ্রথমটি ব্যবহার করা আপনার নিজের ডিরেক্টরিতে বা একক ব্যবহারকারী সিস্টেমে সাধারণত ব্যবহার করা ভাল এবং যখন ব্যাকগ্রাউন্ড প্রক্রিয়া না থাকে তখন অ্যাসিঙ্ক্রোনিকভাবে সেখানে নতুন ফাইল তৈরি করতে পারে। ফ্যাট-আঙুল থেকে রক্ষা করতে, rm -rf /foo/bar/bazবাম থেকে ডানে টাইপ করবেন না । rm -rf /বিশেষ ক্ষেত্রে, কিন্তু rm -rf /usrনা! -rfঅংশটি ছেড়ে দিন , বা শুরু lsকরুন rm -rfএবং পথটি টাইপ করার পরে কেবল অংশটি যুক্ত করুন ।

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