উপ ডিরেক্টরিগুলি অন্তর্ভুক্ত না এমন ডিরেক্টরিগুলি সন্ধান করুন


10

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

আমি জানি যে আমি ls -alRপ্রথম ক্ষেত্রের প্রথম অক্ষরের ( dডিরেক্টরিতে) জন্য পুনরাবৃত্তভাবে আউটপুট ব্যবহার করতে এবং পার্স করতে পারি । আমি মনে করি awkপার্স এবং অনুসন্ধানের সেরা উপায়।

উদাহরণস্বরূপ, ls -alবর্তমান ডিরেক্টরিতে একটি সাধারণ আউটপুট:

   drwxr-xr-x  22 af      staff    748 18 Mar 22:21 .
   drwxr-xr-x   5 root    admin    170 17 Mar 18:03 ..
   -rw-------   1 af      staff      3 17 Mar 16:37 .CFUserTextEncoding
   drwxr-xr-x   5 af      staff    170 17 Mar 17:12 Public
   drwxr-xr-x   9 af      staff    306 18 Mar 17:40 Sites
   -rw-------   1 af      staff      3 17 Mar 16:37 textd
   

এই আউটপুটে 2 টি ডিরেক্টরি রয়েছে: Publicএবং Sites। ডিরেক্টরি Publicসাবডিরেক্টরি ধারণ করে না, কিন্তু Sitesনা। এখানে 3 টি উপ-ডিরেক্টরি রয়েছে Sites। সুতরাং আমাকে কেবল সেই ডিরেক্টরিগুলি প্রতিধ্বনিত করতে হবে যাগুলির মধ্যে ডিরেক্টরি নেই। আমার ক্ষেত্রে, এটি শুধুমাত্র Sites

উত্তর:


1

আপনার মোটেও ব্যবহার awkকরার দরকার নেই । অন্তর্নির্মিত পরীক্ষাগুলি ব্যবহার করুন kshযা এইরকম কিছু সরবরাহ করে:

#!/bin/ksh

for NAME in *
do
    FOUND=no
    if [[ -d $NAME && $NAME != '.' && $NAME != '..' ]]
    then
        for SUBNAME in $NAME/*
        do
            if [[ -d $SUBNAME ]]
            then
                FOUND=yes
                break
            fi
        done
        if [[ $FOUND == no ]]
        then
            echo Found only files in $NAME
        fi
    fi
done

এই ছোট স্ক্রিপ্টটি বর্তমান ডিরেক্টরিতে সমস্ত ডিরেক্টরিতে দেখায় এবং আপনাকে জানায় যে সেগুলিতে কেবল ফাইল রয়েছে, কোনও উপ ডিরেক্টরি নেই।


14

যদি আপনি ব্যবহার করতে সক্ষম হন findএবং আপনি যদি একটি "নরমাল ইউনিক্স ফাইল সিস্টেম" (যেটি ফাউন্ড (1) -Nleaf বিকল্প বর্ণনার অধীনে সংজ্ঞায়িত করা হয়েছে ) হিসাবে কাজ করছেন তবে নিম্নলিখিত কমান্ডটি ব্যবহার করা যেতে পারে:

find . -type d -links 2

প্রতিটি ডিরেক্টরিতে কমপক্ষে 2 টি নাম (হার্ড লিঙ্ক) থাকে: .এবং এর নাম। এর উপ-ডিরেক্টরিগুলি, যদি কোনও ..হয় তবে প্যারেন্ট ডিরেক্টরিতে একটি পয়েন্টিং থাকবে , সুতরাং এন সাব-ডিরেক্টরিগুলির সাথে একটি ডিরেক্টরিতে N + 2 এর সমান হার্ড লিঙ্ক গণনা থাকবে। সুতরাং, 2 এর সমান হার্ড লিঙ্ক গণনা সহ ডিরেক্টরিগুলি অনুসন্ধান করা, আমরা N = 0 উপ-ডিরেক্টরি সহ ডিরেক্টরি অনুসন্ধান করি।

সুতরাং, যদি আপনি এটি ব্যবহার করতে পারেন তবে findএটি তর্কাতীতভাবে দ্রুততম পদ্ধতি এবং এর stat()প্রতিটি সদস্যের ডিরেক্টরিতে থাকা সামগ্রীর ডিরেক্টরিতে থাকা শেল লুপগুলির চেয়ে স্পষ্টতই উচ্চতর ।


ডিরেক্টরিতে যদি কোনও ফাইল থাকে তবে এটি কাজ করছে বলে মনে হচ্ছে না।
ব্যবহারকারী 394

1
এটি ডিরেক্টরি তালিকার এন্ট্রি সম্পর্কে নয়, এটি ডিরেক্টরিটির ইনডকে উল্লেখ করে এমন কঠিন লিঙ্কগুলির বিষয়ে। উদাহরণস্বরূপ, যদি /some/directory# 12345678 ইনোড থাকে, যদি এর কোনও উপ-ডিরেক্টরি না থাকে তবে সেই ইনোডের সাথে ঠিক 2 হার্ড লিঙ্ক থাকবে: /some/directory/.এবং /some/directory। ডিরেক্টরিতে কোনও ফাইল রয়েছে কিনা তা এটি কাজ করে।
telcoM

উল্লেখযোগ্য যে বিটিআরএফএস এই ক্ষেত্রে একটি "সাধারণ ইউনিক্স ফাইল সিস্টেম" নয়: দুর্ভাগ্যক্রমে ডিরেক্টরিগুলির সর্বদা একটি লিঙ্ক গণনা থাকে 1 (তবে .এবং foo/..একই
পিটার কর্ডেস

3

*/বর্তমান ডিরেক্টরিটির উপ-ডিরেক্টরিগুলির সাথে মেলে। এটিতে ডিরেক্টরিগুলির প্রতীকী লিঙ্কগুলি অন্তর্ভুক্ত রয়েছে, যা আপনি চাইবেন বা নাও করতে পারেন।

Ksh93 এ, ~(N)প্যাটার্নের শুরুতে যোগ করা কোনও মিল না থাকলে খালি তালিকায় প্রসারিত করে। এটি ছাড়া কোনও মিল না থাকলে প্যাটার্নটি অপরিবর্তিত থাকে।

নিম্নলিখিত ksh93 ফাংশনটি বর্তমান ডিরেক্টরিগুলির উপ-ডিরেক্টরিগুলি তালিকাভুক্ত করে যা কোনও ডিরেক্টরিতে কোনও উপ-ডিরেক্টরি বা কোনও লিঙ্ক ধারণ করে না।

list_leaf_directories () {
  local FIGNORE='.?(.)'        # don't ignore dot files
  local d
  for d in */; do
    [[ -L $d ]] || continue;   # skip symbolic links
    set -- ~(N)"$d"/*/
    if ((!$#)); then echo "$d"; fi
  done
done

0

যদি আমি আপনাকে ভুল বোঝাবুঝি না করে থাকি তবে আপনি কেবল ডিরেক্টরিতে ফাইলগুলি সাবডাইরেক্টরিগুলিতেই সন্ধান করতে চান। এটি যদি আপনার উদ্দেশ্য হয় তবে সমাধানটি এখানে

find . -type f

আপনি যদি নিয়মিত ফাইলগুলি (যেমন ব্লক ডিভাইস ফাইল, চরিত্রের ডিভাইস ফাইল ইত্যাদি) অনুসন্ধান করতে চান তবে findকমান্ডের জন্য ম্যান পৃষ্ঠাটি দেখুন এবং সেই পৃষ্ঠায় টাইপ কীওয়ার্ডটি সন্ধান করুন। আপনি নিয়মিত ফাইল এবং ডিরেক্টরি ইত্যাদি সহ বিভিন্ন ফাইল টাইপ দেখতে পাবেন

আশা করি এটিই আপনি খুঁজছেন


না, এটা মোটেই প্রশ্ন নয়। আপনি / ক্যাটালগ / ডিরেক্টরি / জি একবার নিখরচায় পরিষ্কার হয়। নাট কুপ এমন ডিরেক্টরি খুঁজছেন যা সাব-ডিরেক্টরি অন্তর্ভুক্ত করে না।
গিলস 23'12 এ 'খারাপ হওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.