一个列出文件、目录、可执行文件和链接的简单脚本。你有没有想过列出目录中的所有文件,但只列出文件而不是其他任何东西。只列出目录怎么样?如果是这样,下面的脚本可能正是您一直在寻找的,它是在GPLv3下开源的。当然,你可以使用查找命令:find。-maxdepth1-typef-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:addlsp(listpipes)##Usage:#[switchesvalidforlscommand][dirname...]##Workswithnamesthatincludesspacesandthatstart##由NickClifton创建。#版本1.4#版权所有(c)2006、2007RedHat。##这是免费软件;您可以根据自由软件基金会发布的#GNU通用公共许可证的条款重新分发和/或修改它#;版本3,或(根据您的#选项)任何更高版本。#它的分发是希望它有用,但#没有任何保证;甚至没有对#适销性或特定用途适用性的默示保证。有关详细信息,请参阅#GNU通用公共许可证ils.#ToDo:#处理递归,例如:lsl-R#处理带参数的开关,例如--block-size#处理--almost-all、--ignore-backups、--format和--ignoremain(){initparse_args${1+"$@"}list_objectsexit0}report(){echo$prog":"${1+"$@"}}fail(){report"内部错误:"${1+"$@"}exit1}#初始化全局变量。init(){#默认列出当前目录中的内容。目录[0]=“。”;#num_dirs是要列出的目录数减一。#这是因为我们从零开始索引dirs[]数组。目录数=0;#默认忽略以句号开头的内容。no_dots=1#注意-全局变量'type'和'opts'在#parse_args函数中初始化。}#解析我们的命令行parse_args(){localno_more_argsno_more_args=0;prog=`basename$0`;#决定我们是列出文件还是目录。lsf中的案例$prog|LSF.sh)type=fopts="";;;最低价|lsd.sh)type=d#列出目录时假定-d切换到“ls”。选择=“-d”;;;lsl|lsl.sh)type=l#使用-d防止列出的链接被跟踪。选择=“-d”;;;LSX|lsx.sh)type=ffind_extras="-perm/111";;*)失败“无法识别的程序名称:‘$prog’,预期为‘lsd’、‘lsf’、‘lsl’或‘lsx’”;;esac#找到ls的任何其他命令行开关并累积它们。#同样将非开关累加到目录列表中。while[$#-gt0]docase"$1"in#FIXME:处理带参数的开关,例如--block-size#FIXME:正确处理--almost-all,--ignore-backups,--format#FIXME:and--ignore#FIXME:正确处理--recursive-a|-A|--全部|--几乎所有)没有_点=0;;;--version)report"version1.2"exit0;;--help)case$typeind)报告“只列出目录的'ls'版本”;;l)报告“只列出链接的‘ls’版本”;;f)如果["x$find_extras"="x"];然后报告“只列出文件的‘ls’版本”;否则报告“只列出可执行文件的‘ls’版本”;菲;;esac出口0;;--)#一个开关表示命令行上的所有其他项目都是#参数而不是开关。no_more_args=1;;;-*)如果["x$no_more_args"="x1"];然后dirs[$num_dirs]="$1";let"num_dirs++"else#检查一个只使用一个破折号的开关,不是双#破折号。这实际上可能是多个开关组合成一个词,例如“lsd-alF”。在这种情况下,扫描-a开关。#XXX:FIXME:使用=~需要bashv3.0+。如果[["x${1:1:1}"!="x-"&&"x$1"=~"x-.*a.*"]];然后no_dots=0;fiopts="$opts$1";菲;;*)dirs[$num_dirs]="$1";让“num_dirs++”;;esacshiftdone#记住我们是从零开始计数而不是一。如果[$num_dirs-gt0];然后让"num_dirs--"fi}list_things_in_dir(){localdir#Paranoia检查-用户不应该遇到这些。如果测试“x$1”=“x”;然后失败“list_things_in_dircalledwithoutargument”fiiftest"x$2"!="x";然后失败“list_things_in_dircalledwithtoomanyarguments"fi#在访问$dir时使用引号以保留#目录名称中可能存在的任何空格。dir="${dirs[$1]}";#捕获以a开头的目录名称dash-他们#混淆pushd.iftest"x${dir:0:1}"="x-";thendir="./$dir"fiif[-d"$dir"]thenif[$num_dirs-gt0]thenecho"$dir:"fi#使用pushd而不是传递目录名称来查找,以便find传递给xargs的名称没有任何前缀。pushd"$dir">/dev/nullif[$no_dots-ne0];然后find.-maxdepth1-type$type$find_extras-not-name".*"-printf"%f\000"\|xargs--null--no-run-if-emptyls$opts--;elsefind.-maxdepth1-type$type$find_extras-printf"%f\000"\|xargs--null--no-run-if-emptyls$opt小号——;fipopd>/dev/nullelsereport"directory'$dir'couldnotbefound"fi}list_objects(){localii=0;while[$i-le$num_dirs]dolist_things_in_dir我让“i++”完成}#调用mainmain${1+"$@"}