খালি ডিরেক্টরি UNIX সন্ধান করা


92

প্রদত্ত ডিরেক্টরিগুলির তালিকার জন্য আমাকে খালি ডিরেক্টরিগুলি সন্ধান করতে হবে। কিছু ডিরেক্টরি এর ভিতরে ডিরেক্টরি আছে।

যদি ভিতরে ডিরেক্টরিগুলিও খালি থাকে তবে আমি বলতে পারি যে মূল ডিরেক্টরিটি খালি রয়েছে অন্যথায় এটি খালি নয়।

আমি কীভাবে এটি পরীক্ষা করতে পারি?

উদাহরণ স্বরূপ:

A>A1(file1),A2 this is not empty beacuse of file1
B>B1(no file) this is empty
C>C1,C2 this is empty

4
আমি মনে করি মার্টিনের উত্তর এখানে সবচেয়ে উপযুক্ত। বর্তমান গৃহীত উত্তরটি কেবল একটি অসম্পূর্ণ সিউডোকোড।
লিও লোপোল্ড হার্টজ

উত্তর:


34

কিছু find <dir> -type fআউটপুট দেয় কিনা তা পরীক্ষা করে দেখুন । এখানে একটি উদাহরণ:

for dir in A B C; do
    [ -z "`find $dir -type f`" ] && echo "$dir is empty"
done

4
না, এটি উপ-ডিরেক্টরিগুলি আউটপুট দেবে না। এটা কি -type fজন্য হয়।
মার্সেলো ক্যান্টোস

খালি ফাইল থাকলেও আপনার সমাধান বার্তাটি দেবে না।
ইয়াসির আরসানুকায়েভ

4
ইয়াসির: আমি ভাবব যে খালি ফাইলের ক্ষত রয়েছে এমন একটি ডিরেক্টরি নিজে খালি নেই। এটা কি সঠিক ফলাফল হবে না?
উক্কো

4
@akostadinov: যদি আমি ওপি দ্বারা নির্দেশিত ডিরেক্টরি এবং ফাইলগুলি তৈরি করি mkdir A B C A/A1 A/A2 B/B1 C/C1 C/C2; touch A/A1/file1- এবং আমার উত্তরে কোডটি চালায় তবে এটি রিপোর্ট করে যে বি এবং সি খালি রয়েছে, ওপি দ্বারা প্রয়োজনীয়। সুতরাং আপনার চেয়ে কিছুটা বেশি নির্দিষ্ট হওয়া দরকার, "এটি কাজ করবে না"।
মার্সেলো ক্যান্টোস

4
আপনি যদি আমার মতো বাশ নুব হন তবে এখানে -z এর অর্থ কী তা পরীক্ষা করে দেখুন ।
ওমারঅথম্যান

261

এটি খালি ডিরেক্টরিগুলির সাথে আপনি কী করতে চান তার উপর এটি কিছুটা নির্ভর করে। আমি নীচের কমান্ডটি ব্যবহার করি যখন আমি কোনও গাছের মধ্যে সমস্ত খালি ডিরেক্টরি মুছতে চাই, testডিরেক্টরি বলি ।

find test -depth -empty -delete

উপরের কমান্ডটি সম্পর্কে লক্ষ্য করার একটি বিষয় হ'ল এটি খালি ফাইলগুলিও সরিয়ে ফেলবে , তাই এড়াতে- টাইপ ডি বিকল্পটি ব্যবহার করুন ।

find test -depth -type d -empty -delete

-deleteফাইল এবং ডিরেক্টরি মেলে দেখতে ড্রপ ।

যদি খালি ডিরেক্টরি গাছের আপনার সংজ্ঞাটি এটিতে কোনও ফাইল থাকে না তবে আপনি কিছু find test -type fফিরিয়ে দেন কিনা তার উপর ভিত্তি করে আপনি কিছু একসাথে আটকে রাখতে সক্ষম হবেন ।

find এটি একটি দুর্দান্ত ইউটিলিটি এবং আরটিএফএম তাড়াতাড়ি এবং প্রায়শই এটি বুঝতে পারে যে এটি কীভাবে করতে পারে :-)


8
-পলিটিত ইঙ্গিত
ডাঃ ব্যক্তি দ্বিতীয়

4
-emptyএত সুবিধাজনক সম্পর্কে জানতাম না !
রাফি 14

4
তবে এমন মেশিনে যা সর্বশেষতম এবং সর্বশ্রেষ্ঠ লিনাক্স নয়। (ইজি সোলারিস), তারপরে আপনার কাছে কোনও-অভিনেত্রী বা-মোছার মতো কোনও বৈশিষ্ট্য নেই।
এন্থনি

4
ম্যাকোস-এক্স-এ, প্রায় খালি ডিরেক্টরিগুলির জন্য, find test -name ".DS_Store" -deleteপ্রথমে চালনা করুন , তারপরে -empty deleteকমান্ড দিন। এছাড়াও নোট করুন, pushdপিতামাতার ডিরেক্টরিতে পছন্দ করুন, যাতে এটি find testহয়ে যায় find .তবে বাকী কমান্ডগুলি একই।
অলি

4
@ মার্টিন আপনি কি দয়া করে -depthএখানে সংজ্ঞাটি যুক্ত করতে পারেন অর্থাৎ গভীরতা-প্রথম ট্র্যাভারসাল সম্পাদনের কারণ অনুসন্ধান করুন, অর্থাত্ ডিরেক্টরিগুলি পোস্ট- অর্ডে পরিদর্শন করা হয় এবং ডিরেক্টরিতে সমস্ত ডিরেক্টরিতে ডিরেক্টরিতে প্রবেশের আগেই কোনও ডিরেক্টরিতে প্রবেশ করা হবে। আমি মনে করি এটি এখানে প্রাসঙ্গিক।
লিও লোপল্ড হার্টজ

50

আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন:

find . -type d -empty

4
-empty কেবলমাত্র বর্তমান ডিরেক্টরিটি সম্পূর্ণ ফাঁকা থাকলে কাজ করে, সাবট্রিতে কোনও ফাইল না থাকলে নয়।
মার্সেলো ক্যান্টোস

@ এসফিল্ড পরীক্ষিত । -ফ্রিবিএসডি এবং সেন্টোস-এর সাথে টাইপ ডি-এমপিটি । ঠিকভাবে কাজ করে. আপনার ওএস কি?
মজগ

4
এইচপি-ইউএক্স তাই কোনও খালি প্যারামিটার নেই
ফিল্ড

@ এসফিল্ড, সুতরাং আপনি দেখুন, আপনার প্রশ্নের শীর্ষে এই তথ্যটি পোস্ট করা ভাল (আমাদের সবার জন্য) ভাল ...
মশগ

4
সোলারিসের উপর কোনও ক্ষমতা নেই, তবে এটি গভীরতা-প্রথম ট্র্যাভারসাল কার্যকর করার জন্য রয়েছে যাতে প্যারেন্ট ডিরেক্টরিটি শূন্যতার জন্য পরীক্ষা করার আগে খালি সাব ডাইরেক্টরিগুলি মুছতে পারে।
eirikma

26
find directory -mindepth 1 -type d -empty -delete

এটি সেই সংস্করণ যা আমি সবচেয়ে আকর্ষণীয় বলে মনে করি। যদি ভিতরের ডিরেক্টরি থেকে কার্যকর করা হয় তবে এটি নীচের সমস্ত খালি ডিরেক্টরি মুছে ফেলবে (কোনও ডিরেক্টরি যদি খালি ডিরেক্টরিতে থাকে তবে এটি খালি মনে করা হবে)।

মাইন্ডপথ বিকল্পটি ডিরেক্টরিটি খালি হয়ে থাকলে মুছে ফেলা থেকে নিজেকে আটকায়।


4
rmdir --ignore-fail-on-non-empty -p directoryঅভিভাবকদের পাশাপাশি পরিত্রাণ পেতে আপনি এটি অনুসরণ করতে পারেন ।
পিট পিটারসন

@ পিট পিটারসন আমার কমান্ডটি এমন ডিরেক্টরিগুলি সরিয়ে ফেলবে যা কেবলমাত্র অন্যান্য খালি ডিরেক্টরি (যা ওপিও চায় বলে মনে হয়)। আমি নোট করেছি যে আপনার কমান্ডটি সাধারণত ব্যবহারকারীকে তারা যা চান তা সম্পাদন করে এমনকি একটি অনুপস্থিত আই-নোড সহ একটি ডিরেক্টরিতে রেখে দেবে যা তাদের কাছে বিভ্রান্তিকর হতে পারে। সম্ভবত আমি বিন্দু মিস করছি।
ডাঃ ব্যক্তি ব্যক্তি দ্বিতীয়

23

find . -type d -empty

বর্তমান গাছটিতে খালি ডিরেক্টরি এবং উপ-ডিরেক্টরিগুলি সন্ধান করে এবং তালিকাবদ্ধ করে। যেমন খালি ডায়ার এবং সাবডিয়ারগুলির ফলাফল:

./2047
./2032
./2049
./2063
./NRCP26LUCcct1/2039
./NRCP26LUCcct1/2054
./NRCP26LUCcct1/2075
./NRCP26LUCcct1/2070

ডিরেক্টরিগুলিতে কোনও অপারেশন করা হয় না। তারা কেবল তালিকাভুক্ত করা হয়। এটি আমার পক্ষে কাজ করে।


16

খালি ডায়ার সন্ধান করুন

খালি ডিরেক্টরিগুলি অনুসন্ধান করার জন্য (প্রশ্নের শিরোনামে উল্লিখিত), মশকের উত্তরটি সঠিক:

find -type d -empty

তবে -emptyখুব পুরানো findসংস্করণে উপলভ্য নাও হতে পারে ( উদাহরণস্বরূপ এটি এইচপি-ইউএক্সের ক্ষেত্রে)। যদি এটি আপনার ক্ষেত্রে হয় তবে নীচের বিভাগে বর্ণিত কৌশলগুলি দেখুন ডিরেক্টরিটি কি খালি?

খালি ডায়ারগুলি মুছুন

এটি কিছুটা জটিল: ধরুন কোনও ডিরেক্টরিতে MyDirফাঁকা ডিরেক্টরি রয়েছে। এই খালি ডিরেক্টরিগুলি সরানোর পরে, MyDirএকটি খালি ডিরেক্টরি হয়ে যাবে এবং এটিও সরানো উচিত। অতএব আমি rmdirবিকল্পটি --parents(বা -p) দিয়ে কমান্ডটি ব্যবহার করি যা সম্ভব হলে পিতামহীন ডিরেক্টরিগুলি সরিয়ে দেয়:

find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} +

পুরানো findসংস্করণে বিবৃতিটি +এখনও সমর্থিত নয়, সুতরাং আপনি এর ;পরিবর্তে ব্যবহার করতে পারেন :

find -type d -empty -exec rmdir -vp --ignore-fail-on-non-empty {} `;`

একটি ডিরেক্টরি ফাঁকা?

এই উত্তরগুলির বেশিরভাগে ডিরেক্টরিটি ফাঁকা আছে কিনা তা পরীক্ষা করে দেখুন। অতএব আমি তিনটি আলাদা কৌশল এখানে জানি যা আমি জানি:

  1. [ $(find your/dir -prune -empty) = your/dir ]

    d=your/dir
    if [ x$(find "$d" -prune -empty) = x"$d" ]
    then
      echo "empty (directory or file)"
    else
      echo "contains files (or does not exist)"
    fi
    

    একটি প্রকরণ:

    d=your/dir
    if [ x$(find "$d" -prune -empty -type d) = x"$d" ]
    then
      echo "empty directory"
    else
      echo "contains files (or does not exist or is not a directory)"
    fi
    

    ব্যাখ্যা:

    • find -prunefind -maxdepth 0কম অক্ষর ব্যবহার করার মতোই
    • find -type d ডিরেক্টরি মুদ্রণ
    • find -empty খালি ডিরেক্টরি এবং ফাইল মুদ্রণ

      > mkdir -v empty1 empty2 not_empty
      mkdir: created directory 'empty1'
      mkdir: created directory 'empty2'
      mkdir: created directory 'not_empty'
      > touch not_empty/file
      > find empty1 empty2 not_empty -prune -empty
      empty1
      empty2
      
  2. (( ${#files} ))

    এই কৌশলটি 100% bashতবে উপ-শেলটি আহরণ করে (স্প্যান করে)। ধারণাটি ব্রুনো ডি ফ্রেইনের এবং টিমবোবের মন্তব্য দ্বারা উন্নত । আপনি যদি এটি ব্যবহার করেন তবে আমি এটির পরামর্শ দিচ্ছি এবং যদি আপনার স্ক্রিপ্টটি পোর্টেবল না হয়।

    files=$(shopt -s nullglob dotglob; echo your/dir/*)
    if (( ${#files} ))
    then 
      echo "contains files"
    else 
      echo "empty (or does not exist or is a file)"
    fi
    

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

  3. [ $(ls -A your/dir) ]

    এই কৌতুক থেকে অনুপ্রাণিত হয় nixCraft এর নিবন্ধ 2007 সালে পোস্ট অ্যান্ড্রু টেলর 2008 সালে এর উত্তরে gr8can8dian 2011 সালে।

    if [ "$(ls -A your/dir)" ]
    then
      echo "contains files"
    else
      echo "empty (or does not exist or is a file)"
    fi
    

    বা এক-লাইন বাশিজম সংস্করণ:

    [[ "$(ls -A your/dir)" ]] && echo "contains files" || echo "empty or ..."
    

    দ্রষ্টব্য: ডিরেক্টরিটি উপস্থিত না থাকলে lsফিরে আসে $?=2। তবে কোনও ফাইল এবং একটি খালি ডিরেক্টরিতে কোনও পার্থক্য নেই।


rmdir -vpযেহেতু আমাকে কেবল একটি শিকড়ের নীচে সমস্ত খালি ডায়ারগুলি মুছতে হবে তা নয়, একটি ফাইল মুছে ফেলার পরে খালি ডায়ার এবং পিতামাতার ডায়ারগুলি পরীক্ষা করার প্রয়োজন ছিল বলে আমাকে প্রচুর সহায়তা করেছে। আমার পরিস্থিতিতে খালি ডায়ারগুলি যতক্ষণ না তারা গাছের মধ্যে না থাকে ততক্ষণ ঠিক আছে আমি বর্তমানে একটি ফাইল সরিয়ে দিচ্ছি। ধন্যবাদ!
ইথান হোহেনসি

2

এই পুনরাবৃত্ত ফাংশনটি কৌশলটি মনে হচ্ছে:

# Bash
findempty() {
    find ${1:-.} -mindepth 1 -maxdepth 1 -type d | while read -r dir
    do
        if [[ -z "$(find "$dir" -mindepth 1 -type f)" ]] >/dev/null
        then
            findempty "$dir"
            echo "$dir"
        fi
    done
}

এই উদাহরণ ডিরেক্টরি কাঠামো দেওয়া:

    ।
    | - দির 1 /
    | - dir2 /
    | `- dirB /
    | - dir3 /
    | `- ডিআরসি /
    | `- ফাইল 5
    | - dir4 /
    | | - ডিআরডি /
    | `- ফাইল 4
    `- dir5 /
        `- dirE /
            `- দির_ভি /

এই ফাংশনটি চালানোর ফলাফলটি হ'ল:

    ./dir1
    ./dir5/dirE/dir_V
    ./dir5/dirE
    ./dir5
    ./dir2/dirB
    ./dir2

যা মিস করে /dir4/dirD। যদি আপনি এর findempty "$dir"পরে পুনরাবৃত্ত কলটি সরিয়ে থাকেন তবে fiফাংশনটি সেই ফলাফলটিকে তার ফলাফলগুলিতে অন্তর্ভুক্ত করবে।


2

কীভাবে rmdir *? এই কমান্ডটি খালি নয় ডিরেক্টরিতে ব্যর্থ হবে।


সাধারণভাবে পরিষ্কার করার জন্য আমি কিছু সময়ে কিছু করেছি। পছন্দ করতে কাজ rmdir */*/* */* * যদিও যে হ্যান্ডেল না 'ডট ফাইল' কিন্তু তারপর ম্যানুয়াল পরিস্থিতিতে (ডাটা ফাইল পরিষ্কার) আপনি সাধারণত আশা করবেন না 'ডট ফাইল'। পুনরাবৃত্তির পদ্ধতিগুলি আরও বেশি স্বয়ংক্রিয় সাধারণ ক্লিন আপের জন্য, বিশেষত খুব বড় ডিরেক্টরি স্ট্রাকচারে।
এন্থনি

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

1

ডিরেক্টরিটি ফাঁকা থাকলে (বা উপস্থিত না থাকলে) এবং অন্যথায় 0 টি নিম্নলিখিত কমান্ডটি 1 প্রদান করে (যাতে !শেল স্ক্রিপ্টের সাহায্যে রিটার্ন কোডটি উল্টানো সম্ভব ):

find $dir -type d -prune -empty -exec false {} +

0

আমি নীচে একটি সাধারণ কাঠামো তৈরি করেছি:

test/
test/test2/
test/test2/test2.2/
test/test3/
test/test3/file

test/test3/fileকিছু আবর্জনা টেক্সট ধারণ করে।

জারি find test -emptyআয় " test/test2/test2.2" শুধুমাত্র ফাঁকা ডিরেক্টরি হিসাবে।


বিকল্প পরীক্ষা / পরীক্ষা 2 ফেরত

প্রকৃতপক্ষে. তবে আমি বুঝতে পেরেছিলাম যে তিনি আরও যেতে সন্ধানের পৃষ্ঠাটি পড়তে পারেন। ফলাফলের উপর ভিত্তি করে গভীরতা সামঞ্জস্য করে এমন একটি স্ক্রিপ্ট ঠিক কাজ করবে।
জেমস সামার্স

এই mye ব্যবহারের জন্য সবচেয়ে উপযোগী সংস্করণ, ছিল ধন্যবাদ
আন্দ্রিয়াস

0

একটি সহজ পদ্ধতি হবে,

$ [ "$(ls -A /path/to/direcory)" ] && echo "not empty" || echo "its empty"

এছাড়াও,

if [ "$(ls -A /path/to/direcory)" ]; then
   echo "its not empty"
else 
   echo "empty directory"

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