ऐसी निर्देशिकाएँ खोजें जिनमें उपनिर्देशिकाएँ न हों


10

मैं स्क्रिप्ट लिख रहा हूँ ksh है। वर्तमान निर्देशिका के अंतर्गत सीधे सभी निर्देशिका नाम खोजने की आवश्यकता है जिसमें केवल फाइलें हैं, उपनिर्देशिका नहीं।

मुझे पता है कि मैं 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) में -noleaf विकल्प विवरण में परिभाषित है ), तो निम्न कमांड का उपयोग किया जा सकता है:

find . -type d -links 2

प्रत्येक निर्देशिका में कम से कम 2 नाम (हार्ड लिंक) होते हैं: .और उसका नाम। इसकी उपनिर्देशिकाएं, यदि कोई हों, तो ..मूल निर्देशिका की ओर इशारा किया जाएगा , इसलिए N उपनिर्देशिकाओं वाली निर्देशिका में N + 2 के बराबर हार्ड लिंक गणना होगी। इस प्रकार, हार्ड लिंक के साथ निर्देशिकाओं की खोज 2 के बराबर होती है, हम N = 0 उपनिर्देशिकाओं वाली निर्देशिकाओं की खोज करते हैं।

इसलिए, यदि आप उपयोग कर सकते हैं find, तो यह यकीनन सबसे तेज़ तरीका है और जाहिर है stat()कि अपने प्रत्येक सदस्यों की निर्देशिका सामग्री पर इन-शेल लूप से बेहतर है ।


यदि निर्देशिका में कोई फ़ाइल है तो यह काम नहीं करता है।
user394

1
यह निर्देशिका लिस्टिंग में प्रविष्टियों के बारे में नहीं है, यह निर्देशिका के इनोड के संदर्भ में कठिन लिंक के बारे में है। उदाहरण के लिए, यदि /some/directoryइनोड # 12345678 है, अगर इसकी कोई उप-निर्देशिका नहीं है, तो उस इनोड के लिए 2 कठिन लिंक होंगे: /some/directory/.और /some/directory। यह काम करता है कि डायरेक्टरी में कोई फाइल है या नहीं।
टेल्कॉम

इस बात का उल्लेख करते हुए कि BTRFS इस संबंध में "सामान्य यूनिक्स फाइलसिस्टम" नहीं है: निर्देशिका में हमेशा दुर्भाग्यवश 1 की एक कड़ी होती है। (लेकिन .और foo/..एक ही आइनोड संख्या है।)
पीटर Cordes

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कमांड के लिए मैन पेज देखें और उस पेज पर टाइप कीवर्ड खोजें। आपको अलग-अलग फाइलपेट दिखाई देंगे, जिनमें नियमित फाइलें और निर्देशिका आदि शामिल हैं।

आशा है कि यह आप के लिए क्या देख रहे हैं


नहीं, यह सवाल बिल्कुल नहीं है। आपके द्वारा / कैटलॉग / निर्देशिका / जी के बाद यह यथोचित रूप से स्पष्ट है। Nat Kup उन निर्देशिकाओं की तलाश में है जिनमें उपनिर्देशिकाएँ नहीं हैं।
गिल्स एसओ- बुराई को रोकना '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.