Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> बाश प्रोग्रामिंग

बड़े फाइल सिस्टम के लिए इस बैश स्क्रिप्ट को आजमाएं

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

बेशक, आप ढूंढें . का उपयोग कर सकते हैं आदेश:

find . -maxdepth 1 -type f -print

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

ls -F . | grep -v /

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

उपयोग

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

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

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

lsf -a

निर्देशिकाओं को लंबे प्रारूप में सूचीबद्ध करने के लिए, lsd . का उपयोग करें आदेश:

lsd -l

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

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

lsf -F -l .. /usr/bin

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

lsf -R

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

आंतरिक

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

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

निष्कर्ष

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

स्क्रिप्ट

#!/bin/bash

# Script to list:
#      directories (if called "lsd")
#      files       (if called "lsf")
#      links       (if called "lsl")
#  or  executables (if called "lsx")
# but not any other type of filesystem object.
# FIXME: add lsp   (list pipes)
#
# Usage:
#   <command_name> [switches valid for ls command] [dirname...]
#
# Works with names that includes spaces and that start with a hyphen.
#
# Created by Nick Clifton.
# Version 1.4
# Copyright (c) 2006, 2007 Red Hat.
#
# This is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published
# by the Free Software Foundation; either version 3, or (at your
# option) any later version.

# It is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# ToDo:
#  Handle recursion, eg:  lsl -R
#  Handle switches that take arguments, eg --block-size
#  Handle --almost-all, --ignore-backups, --format and --ignore

main ()
{
  init
 
  parse_args ${1+"$@"}

  list_objects

  exit 0
}

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

fail ()
{
  report " Internal error: " ${1+"$@"}
  exit 1
}

# Initialise global variables.
init ()
{
  # Default to listing things in the current directory.
  dirs[0]=".";
 
  # num_dirs is the number of directories to be listed minus one.
  # This is because we are indexing the dirs[] array from zero.
  num_dirs=0;
 
  # Default to ignoring things that start with a period.
  no_dots=1
 
  # Note - the global variables 'type' and 'opts' are initialised in
  # parse_args function.
}

# Parse our command line
parse_args ()
{
  local no_more_args

  no_more_args=0 ;

  prog=`basename $0` ;

  # Decide if we are listing files or directories.
  case $prog in
    lsf | lsf.sh)
      type=f
      opts="";
      ;;
    lsd | lsd.sh)
      type=d
      # The -d switch to "ls" is presumed when listing directories.
      opts="-d";
      ;;
    lsl | lsl.sh)
      type=l
      # Use -d to prevent the listed links from being followed.
      opts="-d";
      ;;
    lsx | lsx.sh)
      type=f
      find_extras="-perm /111"
      ;;    
    *)
      fail "Unrecognised program name: '$prog', expected either 'lsd', 'lsf', 'lsl' or 'lsx'"
      ;;
  esac

  # Locate any additional command line switches for ls and accumulate them.
  # Likewise accumulate non-switches to the directories list.
  while [ $# -gt 0 ]
  do
    case "$1" in
      # FIXME: Handle switches that take arguments, eg --block-size
      # FIXME: Properly handle --almost-all, --ignore-backups, --format
      # FIXME:   and --ignore
      # FIXME: Properly handle --recursive
      -a | -A | --all | --almost-all)
        no_dots=0;
        ;;
      --version)
        report "version 1.2"
        exit 0
        ;;
      --help)
        case $type in
          d) report "a version of 'ls' that lists only directories" ;;
          l) report "a version of 'ls' that lists only links" ;;
          f) if [ "x$find_extras" = "x" ] ; then
               report "a version of 'ls' that lists only files" ;
             else
              report "a version of 'ls' that lists only executables";
             fi ;;
        esac
        exit 0
        ;;
      --)
        # A switch to say that all further items on the command line are
        # arguments and not switches.
        no_more_args=1 ;
        ;;
      -*)
        if [ "x$no_more_args" = "x1" ] ;
        then
          dirs[$num_dirs]="$1";
          let "num_dirs++"
        else
          # Check for a switch that just uses a single dash, not a double
          # dash.  This could actually be multiple switches combined into
          # one word, eg "lsd -alF".  In this case, scan for the -a switch.
          # XXX: FIXME: The use of =~ requires bash 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

  # Remember that we are counting from zero not one.
  if [ $num_dirs -gt 0 ] ;
  then
    let "num_dirs--"
  fi
}

list_things_in_dir ()
{
  local dir

  # Paranoia checks - the user should never encounter these.
  if test "x$1" = "x" ;
  then
    fail "list_things_in_dir called without an argument"
  fi

  if test "x$2" != "x" ;
  then
    fail "list_things_in_dir called with too many arguments"
  fi

  # Use quotes when accessing $dir in order to preserve
  # any spaces that might be in the directory name.
  dir="${dirs[$1]}";

  # Catch directory names that start with a dash - they
  # confuse 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

    # Use pushd rather passing the directory name to find so that the
    # names that find passes on to xargs do not have any paths prepended.
    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 "directory '$dir' could not be found"
  fi
}

list_objects ()
{
  local i

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

# Invoke main
main ${1+"$@"}
. को आमंत्रित करें
  1. स्टारगेजिंग करते समय इस सहायक बैश स्क्रिप्ट का उपयोग करें

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

  1. इस साधारण बैश स्क्रिप्ट के साथ घर पर दो तरफा दस्तावेज़ प्रिंट करें

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

  1. बैश स्क्रिप्टिंग परिचय ट्यूटोरियल 5 व्यावहारिक उदाहरणों के साथ

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