তাদের নামে স্পেস সহ ফাইলগুলি মুছে ফেলা হচ্ছে


10

আমি তাদের নামে একটি জায়গা দিয়ে সমস্ত ফাইল মুছে ফেলার চেষ্টা করছি। আমি নিম্নলিখিত কমান্ড ব্যবহার করছি। তবে এটি আমাকে একটি ত্রুটি দিচ্ছে

আদেশ: ls | egrep '. ' | xargs rm

এখানে যদি আমি কেবল ls | egrep '. 'কমান্ড ব্যবহার করি তবে এটি ফাইলের নামের মধ্যে ফাঁকা স্থানের সমস্ত ফাইলের নাম আমাকে দিচ্ছে। তবে আমি যখন আউটপুটটি আরএম এ যাওয়ার চেষ্টা করছি তখন সমস্ত স্পেস (অগ্রণী বা পিছনে) মুছে ফেলা হবে। সুতরাং আমার কমান্ড সঠিকভাবে কার্যকর হচ্ছে না।

তাদের নামে কমপক্ষে একটি জায়গা থাকা ফাইল মুছবেন কীভাবে কোনও পয়েন্টার?

উত্তর:


29

আপনি rmকমান্ডটিতে স্ট্যান্ডার্ড গ্লোববিং ব্যবহার করতে পারেন :

rm -- *\ *

এটি এমন কোনও ফাইল মুছে ফেলবে যার নামটিতে একটি স্থান রয়েছে; শেলটি পৃথককারী হিসাবে এটি ব্যাখ্যা না করে তাই স্থানটি পালিয়ে গেছে। যোগ --করার ফলে ড্যাশ দিয়ে শুরু হওয়া ফাইলের নামগুলির সাথে সমস্যা এড়ানো হবে (তাদের দ্বারা আর্গুমেন্ট হিসাবে ব্যাখ্যা করা হবে না rm)।

আপনি যদি প্রতিটি ফাইল মোছার আগে নিশ্চিত করতে চান তবে -iবিকল্পটি যুক্ত করুন:

rm -i -- *\ *

4
আপনি অবশ্যই echoটাইপস থেকে রক্ষা পেতে প্রথমে এটি চালাতে চান । যোগ echoসামনে এবং এটি সমস্ত ফাইল এটি অপসারণ যাচ্ছে প্রিন্ট আউট হবে।
রিচিং

1
অনুজ, এটির সবচেয়ে বেশি উত্সাহ থাকার কারণ findহ'ল শক্তিশালী হলেও মাঝে মাঝে আপনাকে মেশিনগান দিয়ে মুরগি মারার দরকার নেই। ইউএনআইএক্স প্রশাসকরা সাধারণত find(উদাহরণস্বরূপ) "এ অক্ষর দিয়ে শুরু করে সমস্ত ফাইল সরিয়ে ফেলুন" এর অবলম্বন করবেন না ... এটি সহজভাবে হবে rm A*। একইভাবে স্পেসযুক্ত ফাইলগুলি সরানোর জন্য, আরএম কাজটি করতে পারে। অন্য কথায়, বোকা বানাবেন না কারণ স্থান অদৃশ্য এবং শেল দ্বারা বিশেষভাবে চিকিত্সা করা হয়। স্টিফেন কিট যেমনটি করেছেন ঠিক তেমনি এড়িয়ে চলুন এবং আপনি অন্য চরিত্রের মতো এটি ভাবতে পারেন।
মাইক এস

14

আমি lsআউটপুট পার্সিং এড়ানো হবে

কেন না :

find . -type f -name '* *' -delete

rm:-) নিয়ে কোনও সমস্যা নেই ।

যদিও এটি পুনরাবৃত্ত হয় এবং মন্তব্যে উল্লিখিত হিসাবে বর্তমান ডিরেক্টরি এবং নেস্টেড ডিরেক্টরিতে স্থান সহ সমস্ত ফাইল মুছে ফেলা হবে।


4
(1) আপনি -name '* *'রেজেক্সের পরিবর্তে ব্যবহার করতে পারেন ; এবং (২) আপনি -print0 | xargs -0 rm -i@ স্টিফেনকিটের উদ্বেগের সমাধান করতে ব্যবহার করতে পারেন ।
কেভিন

1
দরকার নেই xargs। স্রেফ ব্যবহার করুন-exec rm -i '{}' +
আর .. গিটহাব বন্ধ করুন ICE

1
@ এমএইচএমডি এটি 8 বিট গেমিং কনসোলের চেয়ে আরও বেশি সমস্যা পেয়েছে। mywiki.wooledge.org/ পার্সিংএলস
দেনাইথ

1
আপনি যদি সাব-ডিরেক্টরীগুলি এড়াতে চান তবে ব্যবহার করুন find . -maxdepth 1 -name '* *' -delete
মিক্কেল

1
@BenjaminW। স্থির?
solsTiCe

6

মনে করুন এই নামটি "অদ্ভুত ফাইল"

সমাধান এক

rm strange\ file

সমাধান দুটি

rm "strange file"

সমাধান তিন

ls -i "strange file"

আপনি তারপর ইনোড দেখতে পাবেন

find . -inum "numberoofinode" -exec rm {} \;

খুব অদ্ভুত ফাইলের ক্ষেত্রে নাম যেমন

!-filename or --filename

ব্যবহার

rm ./'!-filename'

4

থেকে man xargs

xargs স্ট্যান্ডার্ড ইনপুট থেকে আইটেমগুলি পড়ে, ফাঁকা দ্বারা সীমাবদ্ধ (যা ডাবল বা একক উদ্ধৃতি বা একটি ব্যাকস্ল্যাশ দ্বারা সুরক্ষিত করা যেতে পারে) বা নিউলাইনস, এবং পরবর্তী যে কোনও প্রাথমিক-আর্গুমেন্টের সাথে কমান্ডটি (ডিফল্ট / বিন / প্রতিধ্বনি) এক বা একাধিক বার কার্যকর করে স্ট্যান্ডার্ড ইনপুট থেকে পড়া আইটেম দ্বারা। স্ট্যান্ডার্ড ইনপুটটিতে ফাঁকা রেখাগুলি এড়ানো হবে।

এক্সার্গস ডিলিমিটারকে নতুন লাইনে পরিবর্তন করে আমরা (বেশিরভাগ ক্ষেত্রে) আপনার প্রাথমিক কমান্ডটি ঠিক করতে পারি:

ls | egrep '. ' | xargs -d '\n' rm (এটি করবেন না ... পড়ুন)

তবে ফাইলনামে যদি একটি নতুন লাইন থাকে?

touch "filename with blanks and newline"

কারণ ইউনিক্স ফাইলের নামের ঐ খালি এবং নতুন লাইন থাকতে পারে , এই ডিফল্ট আচরণ প্রায়ই সমস্যাযুক্ত হয়; ফাঁকা এবং / অথবা নিউলাইনযুক্ত ফাইলের নামগুলি xargs দ্বারা ভুলভাবে প্রক্রিয়া করা হচ্ছে। এই পরিস্থিতিতে -0 বিকল্পটি ব্যবহার করা ভাল , যা এই জাতীয় সমস্যাগুলি প্রতিরোধ করে।

ls আসলেই একটি সরাসরি মানুষের সরাসরি ব্যবহারের জন্য একটি সরঞ্জাম , পরিবর্তে আমাদের findকমান্ডটি ব্যবহার করতে হবে যা নাল অক্ষর ( -print0) দিয়ে ফাইলের নামগুলি পৃথক করতে পারে । আমাদের ইনপুট ( -z) এবং আউটপুট ( -Z) আলাদা করতে নাল অক্ষর ব্যবহার করতে গ্রেপকেও বলতে হবে । অবশেষে, আমরা xargs কে নাল অক্ষরও ব্যবহার করতে বলি ( -0)

find . -type f -print0 | egrep '. ' -z -Z | xargs -0 rm



-1

সেভাবে করতে, আপনার গ্রেপ বিকল্প এবং xargs -Zএর -0বিকল্পের প্রয়োজন হবে । তবে আমি এটি সেভাবে lsকরব না ( কাজের সঠিক সরঞ্জাম নয়, কম্পিউটারটি এর আউটপুট পড়তে পেতে অনেক সমস্যা রয়েছে)।

আরও ভাল উপায়ের জন্য অন্যান্য উত্তরগুলি দেখুন।


এছাড়াও

ls | …সমান ls -d *এবংecho * | …

যার সকলেরই সমস্যা আছে। সুতরাং এর lsমতো ব্যবহার করবেন না , অন্য উত্তর থেকে একটি সমাধান ব্যবহার করুন।


এছাড়াও ls *যখন পাইপ ফাইলের নাম আউটপুট নতুন লাইন সীমায়িত। echo(কমপক্ষে কয়েকটি echoবাস্তবায়ন) ব্যাকস্ল্যাশ ক্রমগুলি প্রসারিত করে। grep -Zফাইলের নাম লেখার জন্য যখন নুল-সীমাবদ্ধ ব্যবহার করা হয় -l, এটি এখানে সাহায্য করবে না। যদি আপনি বোঝাতে চেয়েছিলেন তবে -zএটি কার্যকর হবে না কারণ বেশিরভাগ lsবাস্তবায়নের ক্ষেত্রে ফাইলের নাম নুল সীমান্তে আউটপুট দেওয়ার বিকল্প নেই। কেউ printf '%s\0' * | grep -z ' ' | xargs -r0 rm -fযদিও কিছু করতে পারে ।
স্টাফেন চেজেলাস

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