কোনও নির্দিষ্ট শিশু ডিরেক্টরি ফাঁকা থাকলে পিতামহুল ডিরেক্টরিটি (খালি নয়) মুছুন


11

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

এখানে আরও নির্দিষ্ট করার জন্য কাঠামোটি হ'ল:

A
|
|--------312311
|       |
|       |----Recording
|       |----a.txt
|       |----b.txt
|
|
|--------453453
|       |----Recording
|                   |
|                   |-------a.mp3
|       |----a.txt
|       |----b.txt
|
|
|--------566532
|       |----Recording
|       |----a.txt
|       |----b.txt

উপ-ডিরেক্টরিগুলিতে একটি ফাইল থাকতে পারে বা নাও থাকতে পারে। সুতরাং আমাকে '312311' এবং '566532' এর মতো পুরো ডিরেক্টরিটি মুছতে হবে এবং এতে সমস্ত ডেটা দিয়ে কেবল '453453' রেখে দেওয়া উচিত কারণ এতে 'রেকর্ডিং' ফোল্ডারে একটি ফাইল রয়েছে যা আমার জন্য নির্দিষ্ট ডিরেক্টরি।

আমি অনেকগুলি পোস্ট দেখেছি তবে এটি অনেকগুলি নির্দিষ্ট ফাইলের নামের সাথে লিঙ্ক করে। সপ্তাহে অনেকবার আমার যা করা দরকার তাই যে কোনও সাহায্যের প্রশংসা করা হবে।


ডিরেক্টরিতে রেকর্ডিং সর্বদা প্রথম স্তরে থাকে? এছাড়াও: সমস্ত ডিরেক্টরি কি প্রথম ডিরেক্টরিতে মূল ডিরেক্টরিতে রয়েছে?
জ্যাকব ভিলিজম

এ হ'ল শীর্ষ স্তরের ডিরেক্টরি যা এতে সংখ্যাযুক্ত ডিরেক্টরি রয়েছে। এবং সংখ্যাযুক্ত ডিরেক্টরিতে এটিতে 'রেকর্ডিং' ফোল্ডার পাশাপাশি কিছু 'txt' ফাইল রয়েছে যেমন। এবং 'রেকর্ডিং'-এ এতে ফাইল থাকতে পারে বা নাও থাকতে পারে ..
ডেরেক জেমস

আপনি কি আপনার পাঠ্যের ছবিটি সরিয়ে ফেলবেন এবং প্রকৃত পাঠ্যটি আপনার প্রশ্নে রাখবেন? পাঠ্য চিত্রগুলি প্রক্রিয়া করার জন্য আমাদের কাছে জটিল। অন্যান্য সহজাত সুবিধার মধ্যে প্রকৃত পাঠ্যটি ব্যবহার করা যথেষ্ট পরিমাণে সুবিধাজনক।
এলডি জেমস

আমি আপনাকে জেমস জিজ্ঞাসা করা একই করেছি ..
ডেরেক জেমস

উত্তর:


12

নীচের স্ক্রিপ্টটি আপনার বর্ণনার ঠিক মতো করবে, এটি:

  1. একটি ডিরেক্টরি ভিতরে ফোল্ডার তালিকাভুক্ত
  2. "রেকর্ডিং" নামক ফোল্ডারের জন্য প্রতিটি ফোল্ডারের ভিতরেই তাকান

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

একটি ছবিতে:

A
|
|--------123456
|       |
|       |----Recording
|       |----a.txt
|       |----b.txt
|
|
|--------635623
|       |----Recording
|                   |
|                   |-------a.mp3
|       |----a.txt
|       |----b.txt
|
|
|--------123456
|       |----Recording
|       |----a.txt
|       |----b.txt
|
|--------Monkey.txt

ফলাফল হবে:

A
|
|
|--------635623
|       |----Recording
|                   |
|                   |-------a.mp3
|       |----a.txt
|       |----b.txt
|
|
|--------Monkey.txt

এই পান্ডুলিপি

#!/usr/bin/env python3
import os
import sys
import shutil

dr = sys.argv[1]

def path(*args):
    return os.path.join(*args)

for d in os.listdir(dr):
    try:
        if not os.listdir(path(dr, d, "Recording")):
            shutil.rmtree(path(dr,d))
    except FileNotFoundError:
        shutil.rmtree(path(dr,d))
    except NotADirectoryError:
        pass

ব্যবহার করা

  1. একটি ফাঁকা ফাইলে স্ক্রিপ্টটি অনুলিপি করুন, এটি সংরক্ষণ করুন delete_empty.py
  2. কমান্ড দ্বারা যুক্তি হিসাবে এটি (পূর্ণ!) ডিরেক্টরিটি (আপনার সাবডিয়ারগুলি সহ, আপনার উদাহরণে একটি) দিয়ে চালান:

    python3 /path/to/delete_empty.py /path/to/directory
    

এটাই.

ব্যাখ্যা

স্ক্রিপ্টটিতে আপনার ফোল্ডার "এ" এর সামগ্রী সরবরাহ করা,

os.listdir(dr)

এর উপ-ডিরেক্টরিগুলি (এবং ফাইলগুলি) তালিকাভুক্ত করবে। তারপর:

if not os.listdir(path(dr, d, "Recording"))

প্রতিটি (উপ) ফোল্ডারের প্রতিটি বিষয়বস্তু তালিকাবদ্ধ করার চেষ্টা করবে, যা আইটেমটি ফাইল হলে ত্রুটি বাড়িয়ে তুলবে:

except NotADirectoryError
    pass

বা যদি "রেকর্ডিং" ফোল্ডারটি একেবারেই না থাকে:

FileNotFoundError
    shutil.rmtree(path(dr,d))

যদি "রেকর্ডিং" ফোল্ডারটি বিদ্যমান থাকে এবং খালি থাকে তবে উচ্চতর ফোল্ডারটি সরানো হবে:

if not os.listdir(path(dr, d, "Recording")):
    shutil.rmtree(path(dr,d))

সম্পাদনা

অতিরিক্ত হিসাবে, মন্তব্যে অনুরোধ অনুসারে, এমন একটি সংস্করণ যা একাধিক সাবডিয়ার (নাম) যাচাই করবে।

ডিরেক্টরিতে তালিকাভুক্ত (শূন্যস্থান) সাবডিয়ারগুলির মধ্যে যে কোনও রয়েছে , ডিরেক্টরিটি রাখা হয়। অন্যথায় এটি মুছে ফেলা হবে।

ব্যবহার করা

  1. একটি ফাঁকা ফাইলে স্ক্রিপ্টটি অনুলিপি করুন, এটি সংরক্ষণ করুন delete_empty.py
  2. কমান্ডের মাধ্যমে আর্গুমেন্ট হিসাবে (পূর্ণ!) ডিরেক্টরিটি (আপনার সাবডিয়ার, আপনার উদাহরণে এ) এবং সাবডিয়ারদের নাম দিয়ে এটি চালান:

    python3 /path/to/delete_empty.py /path/to/directory <subdir1> <subdir2> <subdir3>
    

এটাই.

এই পান্ডুলিপি

#!/usr/bin/env python3
import shutil
import os
import sys

dr = sys.argv[1]; matches = sys.argv[2:]

def path(*args):
    return os.path.join(*args)

for d in os.listdir(dr):
    # delete directory *unless* either one of the listed subdirs has files
    keep = False
    # check for each of the listed subdirs(names)
    for name in matches:
        try:
            if os.listdir(path(dr, d, name)):
                keep = True
                break
        except NotADirectoryError:
            # if the item is not a dir, no use for other names to check
            keep = True
            break
        except FileNotFoundError:
            # if the name (subdir) does not exist, check for the next
            pass
    if not keep:
        # if there is no reason to keep --> delete
        shutil.rmtree(path(dr,d))

বিঃদ্রঃ

এটি আপনি যা চান ঠিক তা করে তা নিশ্চিত করার জন্য দয়া করে প্রথমে একটি পরীক্ষা ডিরেক্টরি চালান।


এই কোডটি সত্যই সহায়তা করেছে এবং এটি যেমনটি বলেছিল তেমন কাজ করে। কোডের জন্য ধন্যবাদ। সত্যিই সহায়ক।
ডেরেক জেমস

মনে করুন, যদি আমাকে দুটি ফোল্ডার বা তার বেশি পরীক্ষা করার প্রয়োজন হয় তবে আমি এই কোডটিতে কীভাবে সক্ষম হব? 'OR' বা পাইপ 'যুক্ত করা হচ্ছে 'কোথাও .. সংক্ষেপে পরামর্শ দিন!
ডেরেক জেমস

হাই @ ডেরেকজেমস যা কেবলমাত্র একটি ছোটখাটো সম্পাদনা প্রয়োজন, আমি এই বিকেলে পোস্ট করব।
জ্যাকব ভিলিজম

@ ডেরেক, অপেক্ষা করুন, কোনও ফোল্ডার ফাঁকা থাকলে, বা সমস্ত কি উচ্চতর ফোল্ডারটি সরানো উচিত ? একটি উচ্চতর dir তাদের একাধিক থাকতে পারে?
জ্যাকব Vlijm

ধরুন @ জ্যাকব, আমার দুটি ফোল্ডার রয়েছে 'রেকর্ডিং' এবং 'ভিডিও'। এটি উভয় চেক করা উচিত। সাবফোল্ডারগুলির মধ্যে যদি কোনও ফাইল থাকে তবে '635623' ফোল্ডারটি মুছে ফেলা হবে না। এটি করা যায় কিনা তা পরীক্ষা করতে আরও ফোল্ডার যুক্ত করার ক্ষমতাও ..
ডেরেক জেমস ২

11

ব্যবহার findএবং xargs:

find A -type d -name 'Recording' -empty -printf '%h\0' | xargs -0 echo rm -rf

( echoএকবার আপনি যখন স্বাচ্ছন্দ্য বোধ করেন যে এটি সঠিক ডিরেক্টরিগুলি সনাক্ত করছে তখন সরিয়ে ফেলুন )। printf '%h\0অংশ (নাল সমাপ্ত) পেরেন্ট ডাইরেক্টরি ছাপে - থেকে man find:

       %h     Leading directories of file's name (all but the last ele‐
              ment).  If the file name contains no slashes (since it is
              in  the  current  directory)  the %h specifier expands to
              ".".

প্রাক্তন: প্রদত্ত

$ tree A
A
├── 312311
│   ├── a.txt
│   ├── b.txt
│   └── Recording
├── 453453
│   ├── a.txt
│   ├── b.txt
│   └── Recording
│       └── a.mp3
└── 566532
    ├── a.txt
    ├── b.txt
    └── Recording

6 directories, 7 files

তারপর

$ find A -type d -name 'Recording' -empty -printf '%h\0' | xargs -0 rm -rf
$ 
$ tree A
A
└── 453453
    ├── a.txt
    ├── b.txt
    └── Recording
        └── a.mp3

2 directories, 3 files

এ-টাইপ ডি-নেম 'রেকর্ডিং' -সম্পূর্ণ-প্রিন্টফ '% এইচ \ 0' | সন্ধান করুন xargs -0 প্রতিধ্বনি rm -rf এটি কেবল "আরএম-আরএফ" মুদ্রণ করছে এবং একটি-টাইপ ডি-নামটি 'রেকর্ডিং' -মম্পি -প্রিন্টফ '% এইচ \ 0' | xargs -0 rm -rf কাজ করছে না ... আমি কি কিছু ভুল করছি ..
ডেরেক জেমস

@ ডেরেকজেমসকে আপনার প্রকৃত ডিরেক্টরি সহ এটিকে প্রতিস্থাপন করতে হবে।
জ্যাকব ভিলিজ

বলুন, রেকর্ডিং নামের জায়গায় একটি নিয়মিত প্রকাশ করা ঠিক হবে, কারণ ওপি সংখ্যার সাথে ফাইলগুলির নাম দেয়, বলুন [\d]*?
জর্জ উদোসেন

@ জ্যাকবভিলিজম: আমি প্রকৃত ডিরেক্টরি দিয়ে প্রতিস্থাপন করেছি কিন্তু এখনও কমছি না?
ডেরেক জেমস

পছন্দ করুন এটি আমার সিস্টেমে কাজ করেছে, তবে আপনি সম্ভবত ডিরেক্টরিটিতে সিডি করতে ভুলে গেছেন? ওয়েটওয়েট, এটি গুরুত্বপূর্ণ নয় ...
জ্যাকব ভিলিজম

3

এখানে একটি সহজ বাশ সমাধান:

for d in */; do rmdir "$d/Recording" && rm -r "$d"; done

এটি কাজ করে কারণ rmdirডিরেক্টরিটি ফাঁকা না থাকলে ব্যর্থ হবে এবং সফল না হলে এটি কার্যকর করা থেকে &&রোধ করবে । গ্লোব নিশ্চিত করে যে আপনি কেবল ডিরেক্টরিতে কাজ করছেন তাই অন্য ফাইলগুলি প্রভাবিত হবে না।rm -rrmdir*/


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