बस खाली dirs पाते हैं
खाली निर्देशिकाओं को खोजने के लिए (जैसा कि प्रश्न शीर्षक में निर्दिष्ट किया गया है), मस्जिद का उत्तर सही है:
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 {} `;`
क्या कोई निर्देशिका खाली है?
इनमें से अधिकांश उत्तर बताते हैं कि अगर निर्देशिका खाली है तो कैसे जांच करें। इसलिए मैं यहां उन तीन अलग-अलग तकनीकों को प्रदान करता हूं जिन्हें मैं जानता हूं:
[ $(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 -prune
find -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
(( ${#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
नोट: एक खाली निर्देशिका और एक गैर-मौजूदा वाले के बीच कोई अंतर नहीं है (और यहां तक कि जब भी पथ एक फ़ाइल है)।
[ $(ls -A your/dir) ]
यह ट्रिक 2007 में पोस्ट किए गए nixCraft के लेख से प्रेरित है। एंड्रयू टेलर ने 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
। लेकिन एक फ़ाइल और एक खाली निर्देशिका के बीच कोई अंतर नहीं है।