সন্ধান করুন-মুছে ফেলা অ-খালি ডিরেক্টরি মুছে না


32

আদেশ

$ find ~ -name .DS_Store -ls -delete

ম্যাক ওএস এক্স এ কাজ করে, কিন্তু

$ find ~ -name __pycache__ -type d -ls -delete

না - ডিরেক্টরিগুলি পাওয়া যায় তবে মুছে ফেলা হয় না।

কেন?

গীত। আমি জানি আমি করতে পারি

$ find ~ -name __pycache__ -type d -ls -exec rm -rv {} +

প্রশ্নটি কেন কাজ find -deleteকরে না

উত্তর:


36

findডিরেক্টরি মুছে ফেলার সময় এর -deleteপতাকা সমানভাবে কাজ করে rmdir। ডিরেক্টরিটি পৌঁছে যাওয়ার পরে যদি খালি না থাকে তবে এটি মোছা যাবে না।

আপনাকে প্রথমে ডিরেক্টরি খালি করতে হবে। যেহেতু আপনি উল্লেখ করছেন -type d, এটি আপনার পক্ষে findকরবেন না।

আপনি দুটি পাস করে এটি সমাধান করতে পারেন: প্রথমে নামের ডায়ারের ভিতরে __pycache__সমস্ত কিছু মুছুন, তারপরে নামক সমস্ত ডায়ার মুছুন __pycache__:

find ~ -path '*/__pycache__/*' -delete
find ~ -type d -name '__pycache__' -empty -delete

কিছুটা কম শক্তভাবে নিয়ন্ত্রণ করা তবে একক লাইনে:

find ~ -path '*/__pycache__*' -delete

এটি আপনার বাড়ির মধ্যে যা কিছু আছে __pycache__তার পথের অংশ হিসাবে মুছে ফেলবে ।


৪.৪.২ সন্ধানে, শেষ কমান্ডটি হওয়া দরকার find ~ -path '*/__pycache__*' -delete, অথবা সম্ভবত find ~ -path '*/__pycache__/*' -o -name __pycache__ -deleteনিরাপদ থাকতে হবে।
nnot101

3
@ naught101, যে হওয়া উচিত find ~ \( -path '*/__pycache__/*' -o -name __pycache__ \) -deleteযেমন এবং বেশি প্রাধান্য রয়েছে বা
স্টাফেন চেজেলাস

6

এর বেশ কয়েকটি সম্ভাব্য কারণ রয়েছে।

1) আপনি এটিকে কেবল ডিরেক্টরিগুলি ( -type d) মুছতে বলেছিলেন এবং সেই ডিরেক্টরিগুলির মধ্যে এখনও ফাইল রয়েছে।

2) আপনার ডিরেক্টরিতে কেবল অন্যান্য ডিরেক্টরি রয়েছে, সুতরাং -type dবিষয়বস্তু ইস্যুটি যত্ন নেবে। তবে আপনি ওএস-এক্স ব্যবহার করছেন যা মূলত ফ্রিবিএসডি এর উপর ভিত্তি করে এবং ফ্রিবিএসডি findডিফল্টরূপে ডিরেক্টরিটির বিষয়বস্তুগুলির আগে প্রক্রিয়াজাত করবে।
যাইহোক -depthবিকল্পটি findবিষয়বস্তুগুলির পরে ডিরেক্টরিটি প্রক্রিয়া করার মাধ্যমে এই সমস্যাটি সমাধান করার জন্য বিদ্যমান ।

find ~ -name __pycache__ -type d -ls -delete -depth

এই সমস্যাটি লিনাক্সে বিদ্যমান নেই কারণ -deleteবিকল্পটি সুস্পষ্টভাবে সক্ষম করে -depth

 

ফ্রিবিএসডি man 1 find:

 -depth  Always true; same as the non-portable -d option. Cause find to
   perform a depth-first traversal, i.e., directories are visited in
   post-order and all entries in a directory will be acted on before
   the directory itself. By default, find visits directories in
   pre-order, i.e., before their contents. Note, the default is not
   a breadth-first traversal.

জিএনইউ man 1 find:

 -depth Process each directory's contents before the directory itself. The -delete
        action also implies -depth.

2
হ্যাঁ, কিন্তু FreeBSD 'র খুঁজে (1) জন্য বলছেন -delete, "... গভীরতা প্রথম ট্র্যাভেরসাল প্রক্রিয়াকরণ এই বিকল্প দ্বারা উহ্য হয়।", এবং গনুহ খোঁজ (1) বলেছেন, "... -delete বোঝা -depth , ...", তাই এটি না করা উচিত -depthকমান্ড যোগ করার প্রয়োজন ।
জি-ম্যান বলছেন 'পুনরায় ইনস্টল করুন মনিকা'

1
জিএনইউ findম্যানপেজ থেকে: "বিভ্রান্তি রোধ করতে, প্রথম পরীক্ষা, অবস্থানগত বিকল্প বা ক্রিয়াকলাপের ঠিক আগে, পয়েন্টগুলির তালিকা শুরু করার পরে কমান্ড-লাইনে গ্লোবাল বিকল্পগুলি নির্দিষ্ট করা উচিত you আপনি যদি অন্য কোনও জায়গায় একটি বৈশ্বিক বিকল্প নির্দিষ্ট করে থাকেন তবে খুঁজে পাবেন এটি একটি বিভ্রান্তিকর হতে পারে ব্যাখ্যা করে একটি সতর্কতা বার্তা জারি করুন "" এখন, -deleteএকটি ~প্রদত্ত কমান্ডের পরে "গ্লোবাল বিকল্প" । আমি এটিও লক্ষ্য করেছি যে আপনি যুক্ত করুন -depthবা নাও এটির কোনও পার্থক্য নেই। ননম্পিটি ডিরেক্টরিগুলি মুছে ফেলা হয় না (তবে এটি সম্ভবত কারণ আমি -maxdepthখুব ব্যবহার করি)
ডেভিড টনহোফার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.