如何使用Bash腳本列出文件、目錄、可執(zhí)行文件和鏈接

這篇文章主要為大家展示了“如何使用Bash腳本列出文件、目錄、可執(zhí)行文件和鏈接”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習一下“如何使用Bash腳本列出文件、目錄、可執(zhí)行文件和鏈接”這篇文章吧。

十多年的洛龍網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。網(wǎng)絡(luò)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整洛龍建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)公司從事“洛龍網(wǎng)站設(shè)計”,“洛龍網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。

一個可以列出文件、目錄、可執(zhí)行文件和鏈接的簡單腳本。

你是否曾經(jīng)想列出目錄中的所有文件,但僅列出文件,而不列出其它的。僅列出目錄呢?如果有這種需求的話,那么下面的腳本可能正是你一直在尋找的,它在 GPLv3 下開源。

當然,你可以使用 find 命令:

find . -maxdepth 1 -type f -print

但這鍵入起來很麻煩,輸出也不友好,并且缺少 ls 命令擁有的一些改進。你還可以結(jié)合使用 lsgrep 來達到相同的結(jié)果:

ls -F . | grep -v /

但是,這又有點笨拙。下面這個腳本提供了一種簡單的替代方法。

用法

該腳本提供了四個主要功能,具體取決于你調(diào)用它的名稱:lsf 列出文件,lsd 列出目錄,lsx 列出可執(zhí)行文件以及 lsl 列出鏈接。

通過符號鏈接無需安裝該腳本的多個副本。這樣可以節(jié)省空間并使腳本更新更容易。

該腳本通過使用 find 命令進行搜索,然后在找到的每個項目上運行 ls。這樣做的好處是,任何給腳本的參數(shù)都將傳遞給 ls 命令。因此,例如,這可以列出所有文件,甚至包括以點開頭的文件:

lsf -a

要以長格式列出目錄,請使用 lsd 命令:

lsd -l

你可以提供多個參數(shù),以及文件和目錄路徑。

下面提供了當前目錄的父目錄和 /usr/bin 目錄中所有文件的長分類列表:

lsf -F -l .. /usr/bin

目前該腳本不處理遞歸,僅列出當前目錄中的文件。

lsf -R

該腳本不會深入子目錄,這個不足有一天可能會進行修復(fù)。

內(nèi)部

該腳本采用自上而下的方式編寫,其初始化功能位于腳本的開頭,而工作主體則接近結(jié)尾。腳本中只有兩個真正重要的功能。函數(shù) parse_args() 會仔細分析命令行,將選項與路徑名分開,并處理腳本中的 ls 命令行選項中的特定選項。

list_things_in_dir() 函數(shù)以目錄名作為參數(shù)并在其上運行 find 命令。找到的每個項目都傳遞給 ls 命令進行顯示。

總結(jié)

這是一個可以完成簡單功能的簡單腳本。它節(jié)省了時間,并且在使用大型文件系統(tǒng)時可能會非常有用。

腳本

#!/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 lineparse_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 mainmain ${1+"$@"}

以上是“如何使用Bash腳本列出文件、目錄、可執(zhí)行文件和鏈接”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)站題目:如何使用Bash腳本列出文件、目錄、可執(zhí)行文件和鏈接
網(wǎng)頁網(wǎng)址:http://bm7419.com/article6/igigog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、Google、定制網(wǎng)站、網(wǎng)站導(dǎo)航全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)