Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Bash प्रोग्रामिंग

बड़े फाइलसिस्टम पर फाइलों या डायरेक्टरी को आसानी से सूचीबद्ध करने के लिए बैश स्क्रिप्ट

क्या आप कभी किसी डायरेक्टरी में सभी फाइलों को सूचीबद्ध करना चाहते थे, लेकिन केवल फाइलें, और कुछ नहीं? क्या केवल डायरेक्टरी के बारे में क्या? यदि हाँ, तो निम्नलिखित स्क्रिप्ट, जो GPLv3 के तहत ओपन सोर्स है, वही हो सकती है जिसकी आप तलाश कर रहे थे।

बेशक, आप find कमांड का उपयोग कर सकते हैं:

find . -maxdepth 1 -type f -print

लेकिन यह टाइप करने में बोझिल है, अनफ्रेंडली आउटपुट उत्पन्न करता है, और ls कमांड के कुछ परिशोधन का अभाव है। आप ls और grep को संयोजित करके समान परिणाम प्राप्त कर सकते हैं:

ls -F . | grep -v /

लेकिन फिर से, यह अनाड़ी है। यह स्क्रिप्ट एक सरल विकल्प प्रदान करती है।

उपयोग

स्क्रिप्ट चार मुख्य फंक्शन प्रदान करती है, जो इस बात पर निर्भर करती है कि आप इसे किस नाम से बुलाते हैं: lsf फाइलें सूचीबद्ध करता है, lsd डायरेक्टरी सूचीबद्ध करता है, lsx एक्जीक्यूटेबल सूचीबद्ध करता है, और lsl लिंक सूचीबद्ध करता है।

स्क्रिप्ट की कई प्रतियां इंस्टॉल करने की कोई आवश्यकता नहीं है, क्योंकि सिम्बोलिक लिंक काम करते हैं। यह स्थान बचाता है और स्क्रिप्ट को अपडेट करना आसान बनाता है।

स्क्रिप्ट खोज करने के लिए find कमांड का उपयोग करके काम करती है, और फिर यह जो भी आइटम ढूंढती है उस पर ls चलाती है। इसके बारे में अच्छी बात यह है कि स्क्रिप्ट को दिए गए किसी भी तर्क को ls कमांड में पास किया जाता है। इसलिए, उदाहरण के लिए, यह सभी फाइलों को सूचीबद्ध करता है, यहां तक कि वे जो डॉट से शुरू होती हैं:

lsf -a

लॉन्ग फॉर्मेट में डायरेक्टरी सूचीबद्ध करने के लिए, lsd कमांड का उपयोग करें:

lsd -l

आप कई तर्क प्रदान कर सकते हैं, और फाइल और डायरेक्टरी पथ भी।

यह वर्तमान डायरेक्टरी की पैरेंट डायरेक्टरी में और /usr/bin डायरेक्टरी में सभी फाइलों की एक लंबी वर्गीकृत सूची प्रदान करता है:

lsf -F -l .. /usr/bin

एक चीज जिसे स्क्रिप्ट वर्तमान में नहीं संभालती है, वह है रिकर्सन। यह कमांड केवल वर्तमान डायरेक्टरी में फाइलों को सूचीबद्ध करता है।

lsf -R

स्क्रिप्ट किसी भी सबडायरेक्टरी में नहीं उतरती। यह कुछ ऐसा है जिसे एक दिन ठीक किया जा सकता है।

आंतरिक भाग

स्क्रिप्ट को टॉप-डाउन फैशन में लिखा गया है जिसमें प्रारंभिक फंक्शन स्क्रिप्ट की शुरुआत में हैं और काम का मुख्य भाग अंत के पास किया जाता है। स्क्रिप्ट में केवल दो फंक्शन हैं जो वास्तव में मायने रखते हैं। parse_args() फंक्शन कमांड लाइन को पार्स करता है, विकल्पों को पथनामों से अलग करता है, और ls कमांड-लाइन विकल्पों से स्क्रिप्ट-विशिष्ट विकल्पों को अलग करता है।

list_things_in_dir() फंक्शन एक डायरेक्टरी नाम को तर्क के रूप में लेता है और उस पर find कमांड चलाता है। पाया गया प्रत्येक आइटम प्रदर्शन के लिए ls कमांड को पास किया जाता है।

निष्कर्ष

यह एक सरल स्क्रिप्ट है जो एक सरल फंक्शन को पूरा करती है। यह एक समय बचाने वाला है और बड़े फाइलसिस्टम के साथ काम करते समय आश्चर्यजनक रूप से उपयोगी हो सकता है।

स्क्रिप्ट

#!/bin/bash

# स्क्रिप्ट सूचीबद्ध करने के लिए:
# डायरेक्टरी (यदि "lsd" कहा जाता है)
# फाइलें (यदि "lsf" कहा जाता है)
# लिंक (यदि "lsl" कहा जाता है)
# या एक्जीक्यूटेबल (यदि "lsx" कहा जाता है)
# लेकिन फाइलसिस्टम ऑब्जेक्ट का कोई अन्य प्रकार नहीं।
# FIXME: lsp जोड़ें (पाइप सूचीबद्ध करें)
#
# उपयोग:
# <कमांड_नाम> [ls कमांड के लिए वैध स्विच] [dirname...]
#
# उन नामों के साथ काम करता है जिनमें स्पेस शामिल हैं और जो हाइफ़न से शुरू होते हैं।
#
# निक क्लिफ्टन द्वारा बनाया गया।
# संस्करण 1.4
# कॉपीराइट (c) 2006, 2007 रेड हैट।
#
# यह फ्री सॉफ्टवेयर है; आप इसे पुनर्वितरित कर सकते हैं और/या इसे संशोधित कर सकते हैं
# GNU जनरल पब्लिक लाइसेंस की शर्तों के तहत जैसा कि प्रकाशित किया गया है
# फ्री सॉफ्टवेयर फाउंडेशन द्वारा; या तो संस्करण 3, या (आपके
# विकल्प पर) कोई बाद का संस्करण।
#
# यह इस आशा में वितरित किया जाता है कि यह उपयोगी होगा, लेकिन
# किसी भी वारंटी के बिना; बिना निहित वारंटी के भी
# व्यापारिकता या किसी विशेष उद्देश्य के लिए फिटनेस। देखें
# अधिक विवरण के लिए GNU जनरल पब्लिक लाइसेंस।

# ToDo:
# रिकर्सन को संभालें, जैसे: lsl -R
# उन स्विच को संभालें जो तर्क लेते हैं, जैसे --block-size
# --almost-all, --ignore-backups, --format और --ignore को संभालें

main ()
{
init

parse_args ${1+"$@"}

list_objects

exit 0
}

report ()
{
echo $prog": " ${1+"$@"}
}

fail ()
{
report " आंतरिक त्रुटि: " ${1+"$@"}
exit 1
}

# ग्लोबल वेरिएबल इनिशियलाइज़ करें।
init ()
{
# डिफ़ॉल्ट रूप से वर्तमान डायरेक्टरी में चीजों को सूचीबद्ध करना।
dirs[0]=".";

# num_dirs सूचीबद्ध की जाने वाली डायरेक्टरी की संख्या घटा एक है।
# ऐसा इसलिए है क्योंकि हम dirs[] ऐरे को शून्य से इंडेक्स कर रहे हैं।
num_dirs=0;

# डिफ़ॉल्ट रूप से उन चीजों को अनदेखा करना जो पीरियड से शुरू होती हैं।
no_dots=1

# नोट - ग्लोबल वेरिएबल 'type' और 'opts' इनिशियलाइज़ हैं
# parse_args फंक्शन में।
}

# हमारी कमांड लाइन पार्स करें
parse_args ()
{
local no_more_args

no_more_args=0 ;

prog=`basename $0` ;

# तय करें कि हम फाइलें या डायरेक्टरी सूचीबद्ध कर रहे हैं।
case $prog in
lsf | lsf.sh)
type=f
opts="";
;;
lsd | lsd.sh)
type=d
# डायरेक्टरी सूचीबद्ध करते समय "ls" पर -d स्विच माना जाता है।
opts="-d";
;;
lsl | lsl.sh)
type=l
# सूचीबद्ध लिंक को फॉलो होने से रोकने के लिए -d का उपयोग करें।
opts="-d";
;;
lsx | lsx.sh)
type=f
find_extras="-perm /111"
;;
*)
fail "अनजाना प्रोग्राम नाम: '$prog', 'lsd', 'lsf', 'lsl' या 'lsx' अपेक्षित था"
;;
esac

# ls के लिए किसी भी अतिरिक्त कमांड लाइन स्विच का पता लगाएं और उन्हें संचित करें।
# इसी तरह गैर-स्विच को डायरेक्टरी सूची में संचित करें।
while [ $# -gt 0 ]
do
case "$1" in
# FIXME: उन स्विच को संभालें जो तर्क लेते हैं, जैसे --block-size
# FIXME: --almost-all, --ignore-backups, --format को ठीक से संभालें
# FIXME: और --ignore
# FIXME: --recursive को ठीक से संभालें
-a | -A | --all | --almost-all)
no_dots=0;
;;
--version)
report "संस्करण 1.2"
exit 0
;;
--help)
case $type in
d) report "केवल डायरेक्टरी सूचीबद्ध करने वाला 'ls' का एक संस्करण" ;;
l) report "केवल लिंक सूचीबद्ध करने वाला 'ls' का एक संस्करण" ;;
f) if [ "x$find_extras" = "x" ] ; then
report "केवल फाइलें सूचीबद्ध करने वाला 'ls' का एक संस्करण" ;
else
report "केवल एक्जीक्यूटेबल सूचीबद्ध करने वाला 'ls' का एक संस्करण";
fi ;;
esac
exit 0
;;
--)
# यह कहने के लिए एक स्विच कि कमांड लाइन पर आगे के सभी आइटम
# तर्क हैं न कि स्विच।
no_more_args=1 ;
;;
-*)
if [ "x$no_more_args" = "x1" ] ;
then
dirs[$num_dirs]="$1";
let "num_dirs++"
else
# एक ऐसे स्विच की जांच करें जो डबल के बजाय सिंगल डैश का उपयोग करता है
# डैश। यह वास्तव में एक शब्द में संयुक्त कई स्विच हो सकते हैं,
# जैसे "lsd -alF"। इस मामले में, -a स्विच के लिए स्कैन करें।
# XXX: FIXME: =~ का उपयोग बैश v3.0+ की आवश्यकता है।
if [[ "x${1:1:1}" != "x-" && "x$1" =~ "x-.*a.*" ]] ;
then
no_dots=0;
fi
opts="$opts $1";
fi
;;
*)
dirs[$num_dirs]="$1";
let "num_dirs++"
;;
esac
shift
done

# याद रखें कि हम शून्य से नहीं एक से गिन रहे हैं।
if [ $num_dirs -gt 0 ] ;
then
let "num_dirs--"
fi
}

list_things_in_dir ()
{
local dir

# पैरानोइया चेक - उपयोगकर्ता को इनका सामना कभी नहीं करना चाहिए।
if test "x$1" = "x" ;
then
fail "list_things_in_dir को बिना तर्क के बुलाया गया"
fi

if test "x$2" != "x" ;
then
fail "list_things_in_dir को बहुत सारे तर्कों के साथ बुलाया गया"
fi

# $dir तक पहुंचते समय उद्धरणों का उपयोग करें ताकि
# डायरेक्टरी नाम में हो सकने वाले किसी भी स्पेस को संरक्षित किया जा सके।
dir="${dirs[$1]}";

# उन डायरेक्टरी नामों को पकड़ें जो डैश से शुरू होते हैं - वे
# pushd को भ्रमित करते हैं।
if test "x${dir:0:1}" = "x-" ;
then
dir="./$dir"
fi

if [ -d "$dir" ]
then
if [ $num_dirs -gt 0 ]
then
echo " $dir:"
fi

# डायरेक्टरी नाम को find में पास करने के बजाय pushd का उपयोग करें ताकि
# वे नाम जो find xargs को पास करता है उनमें कोई पथ प्रीपेंड न हो।
pushd "$dir" > /dev/null
if [ $no_dots -ne 0 ] ; then
find . -maxdepth 1 -type $type $find_extras -not -name ".*" -printf "%f\000" \
| xargs --null --no-run-if-empty ls $opts -- ;
else
find . -maxdepth 1 -type $type $find_extras -printf "%f\000" \
| xargs --null --no-run-if-empty ls $opts -- ;
fi
popd > /dev/null
else
report "डायरेक्टरी '$dir' नहीं मिली"
fi
}

list_objects ()
{
local i

i=0;
while [ $i -le $num_dirs ]
do
list_things_in_dir i
let "i++"
done
}

# main को इनवोक करें
main ${1+"$@"}
  1. लिनक्स पर स्टारगेजिंग के दौरान नाइट विजन बनाए रखने के लिए बैश स्क्रिप्ट लिनक्स पर स्टारगेजिंग के दौरान नाइट विजन बनाए रखने के लिए बैश स्क्रिप्ट

    हम अक्सर सर्वरों पर और डेवलपर्स द्वारा लिनक्स के उपयोग के बारे में बात करते हैं, लेकिन इसका उपयोग खगोल विज्ञान सहित कई अन्य क्षेत्रों में भी किया जाता है। लिनक्स के लिए बहुत सारे खगोल विज्ञान उपकरण उपलब्ध हैं, जैसे स्काई मैप, स्टार चार्ट, और आपके टेलीस्कोप को नियंत्रित करने के लिए टेलीस्कोप ड्राइव स

  1. सरल बैश स्क्रिप्ट के साथ घर पर आसानी से डबल-साइडेड दस्तावेज़ प्रिंट करें सरल बैश स्क्रिप्ट के साथ घर पर आसानी से डबल-साइडेड दस्तावेज़ प्रिंट करें

    हमारे घर पर एक लेजर प्रिंटर है। यह हेवलेट पैकर्ड लेजरजेट प्रो CP1525nw कलर प्रिंटर एक पुराना मॉडल है, लेकिन यह एक बेहतरीन वर्कहॉर्स रहा है जो मज़बूती से और रंगीन प्रिंट करता है। मैंने इसे कुछ साल पहले अपने रास्पबेरी पाई को प्रिंट सर्वर के रूप में उपयोग करके अपने होम नेटवर्क पर रखा था। लेजरजेट मेरे ह

  1. Bash स्क्रिप्टिंग में मास्टर करें: 5 वास्तविक-विश्व उदाहरणों के साथ एक व्यावहारिक परिचय Bash स्क्रिप्टिंग में मास्टर करें: 5 वास्तविक-विश्व उदाहरणों के साथ एक व्यावहारिक परिचय

    हमारे चल रहे Unix Sed और Unix Awk सीरीज़ के समान, हम Bash स्क्रिप्टिंग पर कई लेख पोस्ट करेंगे, जो व्यावहारिक उदाहरणों के साथ सभी Bash स्क्रिप्टिंग तकनीकों को कवर करेंगे। शेल एक प्रोग्राम है, जो उपयोगकर्ता कमांड्स की व्याख्या करता है। कमांड्स या तो उपयोगकर्ता द्वारा सीधे दर्ज की जाती हैं या शेल स्क्र