সন্ধানের সাথে নির্দিষ্ট সাবডিরেক্টরি বাদে সমস্ত ফাইল মুছুন


11

aসাবফোল্ডারের সমস্ত ফাইল বাদে ফোল্ডারে অ্যাক্সেস না করা সমস্ত ফাইলকে আমি পুনরাবৃত্তভাবে মুছতে চাই b

find a \( -name b -prune \) -o -type f -delete

তবে, আমি একটি ত্রুটি বার্তা পেয়েছি:

সন্ধান করুন: মুছে ফেলা কর্মটি স্বয়ংক্রিয়ভাবে -পৃষ্ঠাটি চালু হয়, তবে -পরিবর্তন কার্যকর হয় যখন -প্রনুন কিছুই করে না। যদি আপনি যাইহোক চালিয়ে যেতে চান তবে স্পষ্টভাবে-ডেপথ বিকল্পটি ব্যবহার করুন।

যোগ করার -depthফলে সমস্ত ফাইল bঅন্তর্ভুক্ত হয়ে যায়, যা ঘটতে হবে না

কেউ কি এই কাজটি করার নিরাপদ উপায় জানেন?


@ মাইকেলKjörling: আমি এক্সট্লব্লব দেখেছি, তবে আপনি কীভাবে aবাদে সব কিছু অন্তর্ভুক্ত করবেন a/b?
forthrin

cd a && ls -d !(b/*)কাজ করবে না ? (এটি করার rm -rপরিবর্তে , এটি করার জন্য ls -d)
একটি সিভিএন

আপনার পরামর্শ সাবফোল্ডার মোছা। আমি ফোল্ডারগুলি অক্ষত রাখতে চাই। আমি গাছের নীচে (নীচে থাকা ফাইলগুলি বাদে ) সমস্ত ফাইল সন্ধান এবং মুছতে চাই । aa/b
এগিয়ে

সুতরাং শুধু -rrm এড়িয়ে যান। মনে হচ্ছে আপনি যা সম্পর্কে জিজ্ঞাসা করছেন তা বাশের বর্ধিত গ্লোববিং ব্যবহার করে খুব সহজেই উত্তর দেওয়া হয়েছে, এবং তারপরে গ্লোব্বিংয়ের ফলাফলটি আপনি কী করছেন তা আপনার হাতে।
একটি সিভিএন

@ মাইকেলKjörling এই কারণেই যে দুটি সমস্যা অস্পষ্টভাবে সাদৃশ্যযুক্ত সমাধানগুলি প্রশ্নগুলিকে নকল করে না। দুটি সমস্যার বেশিরভাগ সমাধান অন্য সমস্যার সমাধান করে না।
গিলস 'অশুভ হওয়া বন্ধ করুন'

উত্তর:


13

TL; DR: এর -exec rmপরিবর্তে সবচেয়ে ভাল উপায় ব্যবহার করা -delete

find a \( -name b -prune \) -o -type f -exec rm {} +

ব্যাখ্যা:

কেন খুঁজে না নালিশ যখন আপনি ব্যবহার করতে চেষ্টা -deleteসঙ্গে -prune?

সংক্ষিপ্ত উত্তর: কারণ -deleteবোঝায় -depthএবং অকার্যকর করে -depthতোলে -prune

আমরা দীর্ঘ উত্তরে আসার আগে প্রথমে এবং এর বাইরে অনুসন্ধানের আচরণটি পর্যবেক্ষণ করুন -depth:

$ find foo/
foo/
foo/f1
foo/bar
foo/bar/b2
foo/bar/b1
foo/f2

একক ডিরেক্টরিতে অর্ডার সম্পর্কে কোনও গ্যারান্টি নেই। তবে একটি গ্যারান্টি রয়েছে যে কোনও ডিরেক্টরিতে এর সামগ্রীগুলির আগে প্রক্রিয়া করা হয়। foo/যেকোন আগে foo/*এবং তার foo/barআগে নোট করুন foo/bar/*

এটি দিয়ে বিপরীত হতে পারে -depth

$ find foo/ -depth
foo/f2
foo/bar/b2
foo/bar/b1
foo/bar
foo/f1
foo/

নোট করুন যে এখন সব foo/*আগে উপস্থিত foo/। একই সাথে foo/bar

দীর্ঘ উত্তর:

  • -pruneডিরেক্টরিতে নামা থেকে অনুসন্ধানকে বাধা দেয়। অন্য কথায় -pruneডিরেক্টরিগুলির বিষয়বস্তু এড়িয়ে যায়। আপনার ক্ষেত্রে -name b -pruneনামের সাথে কোনও ডিরেক্টরিতে নামা থেকে অনুসন্ধানকে বাধা দেয় b
  • -depthডিরেক্টরিটি নিজেই ডিরেক্টরি আগে তৈরি করার জন্য ডিরেক্টরিগুলির বিষয়বস্তুগুলি প্রক্রিয়া করে। এর অর্থ সময় অনুসারে ডিরেক্টরিতে প্রবেশের প্রক্রিয়া শুরু করে bএর সামগ্রীগুলি ইতিমধ্যে প্রক্রিয়াভুক্ত হয়েছে। সুতরাং কার্যকরভাবে -pruneএটি অকার্যকর -depth
  • -deleteবোঝায় -depthযাতে এটি প্রথমে ফাইলগুলি মুছতে পারে এবং তারপরে খালি ডিরেক্টরিটি। -deleteখালি নয় এমন ডিরেক্টরি মুছতে অস্বীকার করে। আমার ধারণা, -deleteখালি নয় এমন ডিরেক্টরি মুছে ফেলার জন্য এবং / অথবা -deleteবোঝাতে বাধা দেওয়ার জন্য একটি বিকল্প যুক্ত করা সম্ভব হবে -depth। তবে সেটা অন্য গল্প।

আপনি যা চান তা অর্জনের আরও একটি উপায় রয়েছে:

find a -not -path "*/b*" -type f -delete

এটি মনে রাখা সহজ বা নাও হতে পারে।

এই কমান্ডটি এখনও ডিরেক্টরিতে bনেমেছে এবং কেবলমাত্র -notসেগুলি প্রত্যাখ্যান করার জন্য এতে প্রতিটি ফাইলই প্রসেস করে । ডিরেক্টরিটি bবিশাল হলে এটি পারফরম্যান্সের সমস্যা হতে পারে ।

-pathচেয়ে আলাদাভাবে কাজ করে -name-nameপুরো নামের সাথে মিল থাকা অবস্থায় কেবল নামের সাথে (ফাইল বা ডিরেক্টরি) -pathমেলে। উদাহরণস্বরূপ পথ পর্যবেক্ষণ করুন /home/lesmana/foo/bar-name -barনাম আছে কারণ মিলবে bar-path "*/foo*"মিলবে কারণ স্ট্রিং /fooপথে আছে। -pathএটি ব্যবহার করার আগে আপনার কিছুটা জটিলতা বোঝা উচিত। findআরও তথ্যের জন্য ম্যান পৃষ্ঠা পড়ুন ।

সাবধান থাকুন যে এটি 100% বুদ্ধিমানের নয়। "মিথ্যা ধনাত্মক" হওয়ার সম্ভাবনা রয়েছে। কমান্ডটি উপরে যেভাবে লেখা হয়েছে তাতে কোনও ধরণের পিতৃ ডিরেক্টরি রয়েছে এমন কোনও ফাইল এড়িয়ে যাবে যা নাম b(ধনাত্মক) দিয়ে শুরু হচ্ছে । তবে bগাছের অবস্থান নির্বিশেষে কোন নামটি শুরু হচ্ছে এমন কোনও ফাইল এড়িয়ে যাবে (মিথ্যা পজিটিভ)। এটির চেয়ে আরও ভাল অভিব্যক্তি লিখে স্থির করা যায় "*/b*"। পাঠকের জন্য অনুশীলন হিসাবে এটি বাকি রয়েছে।

আমি ধরে নিয়েছি যে আপনি ব্যবহার করেছেন aএবং bস্থানধারক হিসাবে এবং আসল নামগুলি আরও বেশি পছন্দ allosaurusএবং brachiosaurus। আপনি যদি brachiosaurusএর জায়গায় রাখেন bতবে মিথ্যা পজিটিভের পরিমাণ মারাত্মকভাবে হ্রাস পাবে।

কমপক্ষে মিথ্যা পজিটিভগুলি মুছে ফেলা হবে না , সুতরাং এটি তাত্পর্যজনক হবে না। তদ্ব্যতীত, আপনি প্রথমে কমান্ডটি চালিয়ে মিথ্যা পজিটিভগুলি পরীক্ষা করতে পারেন -delete(তবে অন্তর্ভুক্ত রাখার কথা মনে রাখবেন -depth) এবং আউটপুট পরীক্ষা করতে পারেন।

find a -not -path "*/b*" -type f -depth

-not -pathশুধু জিনিস ছিল! উদার ব্যাখ্যার জন্য ধন্যবাদ!
আগস্টেরন

1
কেন -not -pathকাজ করে যখন কাজ -pruneকরে না সে সম্পর্কে কিছু বিশদ বিবরণ সহায়ক হবে না। কেন -not -pathসহাবস্থান করতে পারেন -depth?
ফাহিম মিঠা

3

এর rmপরিবর্তে কেবল ব্যবহার করুন -delete:

find a -name b -prune -o -type f -exec rm -f {} +

1
কেন আপনি rmকাজ করেন এবং deleteনা তা বিশদ দিয়ে বলতে পারেন ?
ফাহিম মিঠা

1
ওহ, আমার ধারণা সম্ভবত কারণ "-ডিলিট খালি অ-ডিরেক্টরিগুলি মুছতে অস্বীকার করে" " সুতরাং খালি নয় ডিরেক্টরি মুছতে অস্বীকার করে। কিন্তু rmসমস্যা নেই। তবে, নির্বিশেষে, সম্প্রসারণ একটি ভাল জিনিস হবে।
ফাহিম মিঠা

@ ফাহিমমিঠা, এর উত্তর প্রশ্নে রয়েছে। -deleteবোঝা যাচ্ছে -depth, যা অবশ্যই কাজ করতে পারে না -prune-pathকাজ করে, তবে যে findডিরেক্টরিগুলিতে এটি অন্বেষণের প্রয়োজন হয় না সেগুলি নামানো থেকে বিরত থাকে না।
স্টাফেন চেজেলাস

0

উপরের উত্তর এবং ব্যাখ্যা খুব সহায়ক ছিল।

আমি "-Exec rm {} +" বা "-নাট -পাথ ... -সিলিট" এর ওয়ার্কআরউন্ড ব্যবহার করি তবে এগুলি "ফাইন্ড ... -ডিলিট" এর চেয়ে অনেক ধীর হতে পারে I আমি "খুঁজে পেয়েছি ... দেখেছি ... - একটি এনএফএস ফাইল সিস্টেমে গভীর ডিরেক্টরিতে "-exec rm {} +" এর চেয়ে "5x দ্রুত চালান - মুছে ফেলুন।

'-নাথ পাথ "সমাধানটিতে বাদ দেওয়া ডিরেক্টরিগুলির নীচে এবং নীচে সমস্ত ফাইল দেখার সুস্পষ্ট ওভারহেড রয়েছে।

"Find .. -exec rm {} +" rm কে কল করে যা সিস্টেম কল করে:

fstatat(AT_FDCWD, path...); 
unlinkat(AT_FDCWD, path, 0)

"ফাইন্ড-ডিলিট" সিস্টেম কল করে:

 fd=open(dir,...);
 fchdir(fd); 
 fstatat(AT_FDCWD, filename,...)
 unlinkat(dirfd, filename,...)

সুতরাং "-exec rm {} +" rm কমান্ড প্রতিটি ফাইলের জন্য দুবার দুবার অনুসন্ধানের জন্য ইনোড করার পুরো পথটি করে, তবে "ফাইন্ড-ডিলেট" বর্তমান ডিরেক্টরিতে ফাইলের নাম এবং লিঙ্কমুক্ত করে। আপনি যখন একটি ডিরেক্টরিতে প্রচুর ফাইল সরিয়ে ফেলেন তখন এটি একটি বড় জয়।

(whine মোড চালু (দুঃখিত))

দেখে মনে হচ্ছে -ডেপথ,-ডিলিট এবং প্রোপুনের মধ্যে মিথস্ক্রিয়াটির নকশা অবিচ্ছিন্নভাবে সাধারণ ক্রিয়াটি করার সবচেয়ে কার্যকরী উপায়টি অপসারণ করে "ফাইলগুলির মধ্যে-ডিরেক্টরিগুলি বাদ দিন"

"-প্রকার এফ-ডিলিট" এর সংমিশ্রণটি ডিরেক্টরি ছাড়ানোর চেষ্টা না করায় ডেপথ ছাড়াই চলতে সক্ষম হওয়া উচিত। বিকল্পভাবে, যদি "সন্ধান" -এর "-deletefile" ক্রিয়া থাকে যা বলে যে ডিরেক্টরিগুলি মুছবেন না, -তাহাটি বোঝানোর প্রয়োজন হবে না।

আরএম কমান্ডের এক্সার্গস বা ফাইন্ড-এক্সেক কলগুলি দ্রুত বাড়ানো যেতে পারে যদি rm- র সম্পূর্ণ পাথগুলিকে সংযুক্ত করার পরিবর্তে ফাইল-নাম বাছাই করা, ডিরেক্টরিগুলি খোলার এবং লিঙ্ক লিঙ্ক (dir_fd, ফাইলের নাম) করার বিকল্প থাকে। -R বিকল্পের সাহায্যে ডিরেক্টরিগুলির মাধ্যমে পুনরাবৃত্তি করার সময় এটি ইতিমধ্যে লিঙ্কমুক্ত (dir_fd, ফাইলের নাম) করে।

(ঝকঝকে মোড বন্ধ)

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