当前位置: 首页 > 科技观察

Linux的ls命令

时间:2023-03-14 22:33:46 科技观察

Linux的ls命令有数量惊人的选项,可以提供有关文件的重要信息。ls命令可以列出POSIX系统上的文件。这是一个简单的命令,但它经常被低估,不是它做了什么(因为它实际上只做一件事),而是如何优化它的使用。要知道在前10个终端命令中,这个简单的ls命令可以排在前三名,因为ls不只是列出文件,它还会告诉你关于它们的重要信息。它会告诉您文件或目录的所有者、每个文件的修改时间,甚至文件的类型。它具有让你知道你在哪里、附近有什么以及你可以用它做什么的功能。如果您对ls的体验仅限于您在.bashrc中的发行版别名,那么您可能会错过它。GNU还是BSD?在了解ls的隐藏功能之前,您必须确定您正在运行的是哪个ls命令。有两个最流行的版本:GNUcoreutils包中包含的GNU版本和BSD版本。如果您运行的是Linux,则很可能安装了GNU版本的ls。如果您运行的是BSD或MacOS,那么您使用的是BSD版本。本文解释了它们的不同之处。您可以使用--version选项在您的计算机上找到版本:$ls--version如果它返回有关GNUcoreutils的信息,那么您拥有GNU版本。如果它返回错误,您可能正在运行BSD版本(运行manls|head以确保)。您还应该调查您的发行版可能具有哪些预设选项。终端命令的自定义通常放在$HOME/.bashrc或$HOME/.bash_aliases或$HOME/.profile中,它们是通过将ls别名化为更复杂的ls命令来完成的。eg:aliasls='ls--color'发行版提供的预设非常有用,但很难分辨哪些是ls本身的特性,哪些是由它的附加选项提供的。如果你想运行ls命令本身而不是它的别名,你可以用反斜杠“转义”命令:$\ls类别单独运行ls将列出具有适合你终端的列数的文件:/examplebunkojdk-10.0.2chapterizeotf2ttf.ffdespacerovertar.shestimate.shpandoc-2.7.1fop-2.3safe_yamlgamestt这是有用的信息,但所有这些文件看起来基本相同,没有方便的图标来快速指示哪个是目录,文本文件或图像等。使用-F(或GNU上的长选项--classify)在每个条目后显示标识文件类型的指示器:$ls~/examplebunkojdk-10.0.2/chapterize*otf2ttf.ff*despacer*overtar.sh*estimate.shpandoc@fop-2.3/pandoc-2.7.1/games/tt*使用此选项,终端中列出的项目使用速记符号按文件类型排序:斜杠(/)表示目录(或“文件夹”)。星号(*)表示可执行文件。这包括二进制文件(编译代码)和脚本(具有可执行权限的文本文件)。@符号(@)表示符号链接(或“别名”)。等号(=)表示套接字。在BSD上,百分号(%)表示whiteout(某些文件系统上的文件删除方法)。在GNU上,尖括号(>)表示一扇门(Illumos和Solaris上的进程间通信)。竖线(|)表示FIFO管道。这个选项的一个更简单的版本是-p,它只区分文件和目录。(LCTT译注:在支持颜色的终端上,使用--color选项来区分不同颜色的文件类型,但要注意,如果输出是管道输出,颜色会消失。)许多发行版将ll别名为ls-l。长列表提供了许多重要的文件属性,例如权限、拥有每个文件的用户、文件所属的组、文件的大小(以字节为单位)以及文件上次更改的日期:$ls-l-rwxrwx---.1seth用户4552017年3月2日estimate.sh-rwxrwxr-x。1seth用户662Apr2922:27factorial-rwxrwx---。1seth用户206977932018年6月29日fop-2.3-bin.tar.gz-rwxrwxr-x。1seth用户62105月22日10:22geteltorito-rwxrwx---。1sethusers177Nov122018html4mutt.sh[...]如果您不需要字节,请添加-h标志(或GNU中的--human)以将文件大小转换为更人性化的表示形式:$ls--human-rwxrwx---。1seth用户4552017年3月2日estimate.sh-rwxrwxr-x。1sethseth662Apr2922:27factorial-rwxrwx---。1seth用户20M2018年6月29日fop-2.3-bin.tar.gz-rwxrwxr-x。1sethseth6.1KMay2210:22geteltorito-rwxrwx---.1sethusers177Nov122018html4mutt.sh要查看更少的信息,您可以仅显示带有-o选项的所有者列,或带有-o选项的拥有组列-g选项:$ls-o-rwxrwx---。1seth4552017年3月2日estimate.sh-rwxrwxr-x。1seth6624月29日22:27阶乘-rwxrwx---。1seth20M2018年6月29日fop-2.3-bin.tar.gz-rwxrwxr-x。1seth6.1K5月22日10:22geteltorito-rwxrwx---.1seth177Nov122018html4mutt.sh还可以结合这两个选项来显示时间和日期格式ls的长列表格式通常如下所示:-rwxrwx---.1sethusers455Mar22017估计.sh-rwxrwxr-x。1seth用户662Apr2922:27factorial-rwxrwx---。1seth用户206977932018年6月29日fop-2.3-bin.tar.gz-rwxrwxr-x。1seth用户62105月22日10:22geteltorito-rwxrwx---。1sethusers177Nov122018html4mutt.sh月份名称不容易排序,无论是通过计算还是识别(取决于你的大脑倾向于喜欢字符串还是整数)。您可以使用--time-style选项和格式名称更改时间戳的格式。可用格式有:full-iso:ISO完整格式(1970-01-0121:12:00)long-iso:ISO长格式(1970-01-0121:12)iso:iso格式(01-0121:12)locale:localizedformat(使用你的区域设置)posix-STYLE:POSIXstyle(replaceSTYLEwiththelocaledefinition)你也可以使用date命令的正式符号创建自定义样式。按时间排序通常,ls命令按字母顺序排序。您可以使用-t选项根据上次更改的时间对文件进行排序(首先列出最新的文件)。例如:$touchfoobarbaz$lsbarbazfoo$touchfoo$ls-tfoobarbazls的标准输出平衡了可读性和空间效率,但有时您需要以特定方式排列的文件列表。对于以逗号分隔的文件列表,请使用-m:ls-m~/examplebar,baz,foo要强制每行一个文件,请使用-1选项(这是数字1,而不是小写的L):$ls-1~/bin/barbazfoo要按文件扩展名而不是文件名对条目进行排序,请使用-X(这是一个大写的X):$lsbar.xfcbaz.txtfoo.asc$ls-Xfoo.ascbaz.txtbar.xfc隐藏一些您可能不关心的ls列表中的杂项。例如,元字符.和..分别代表“本目录”和“父目录”。如果您熟悉如何在终端中切换目录,您可能已经知道每个目录将其自身称为.,并将其父目录称为..,因此当您使用-a选项显示时并不经常需要它隐藏文件提醒你。要显示几乎所有隐藏文件(除了.和..),请使用-A选项:$ls-a....android.atom.bash_aliases[...]$ls-A.android.atom.bash_aliases[...]有许多优秀的Unix工具具有保存备份文件的传统,这些文件的名称后附有特殊字符作为备份文件。例如,在Vim中,备份保存时在文件名后附加一个~字符。这些类型的备份文件多次使我免于犯下愚蠢的错误,但在多年享受它们提供的安全感之后,我觉得不需要它们存在的视觉证据。我相信Linux应用程序可以生成备份文件(如果他们声称这样做的话),而且我很乐意相信它们存在——而不必看到它们。要隐藏备份文件,请使用-B或--ignore-backups来隐藏常见的备份格式(此选项在BSD的ls中不可用):$lsbar.xfcbaz.txtfoo.asc~foo.asc$ls-Bbar。xfcbaz.txtfoo.asc当然备份文件还是存在的;它只是被过滤掉了,所以你不必看到它。除非另外配置,否则GNUEmacs通过在文件名的开头和结尾添加井号(#)来保存备份文件(#file#)。其他应用程序可能使用不同的样式。使用什么模式并不重要,因为您可以使用--hide选项创建自己的排除项:$lsbar.xfcbaz.txt#foo.asc#foo.asc$ls--hide="#*#"bar.xfcbaz.txtfoo.asc递归列出目录除非在指定目录上运行ls,否则不会使用ls命令列出子目录的内容:$ls-Fexample/quux*xyz.txt$ls-Rquuxxyz。txt./example:bar.xfcbaz.txt#foo.asc#foo.asc使用别名使其永久化ls命令可能是shell会话中最常用的命令。它是您的眼睛和耳朵,为您提供上下文信息并确认命令的结果。虽然有很多有用的选项,但ls的部分优点在于简单:两个字符和一个返回键,您就可以确切地知道自己在哪里以及附近有什么。如果您必须停下来考虑(更不用说键入)几个不同的选项,那就不太方便了,所以通常情况下,即使是最有用的选项也不起作用。解决方案是为您的ls命令设置别名,以便在您使用它时获得您最关心的信息。要在Bashshell中为命令创建别名,请在您的主目录中创建一个名为.bash_aliases的文件(开头必须包含一个.)。在此文件中,列出要创建的别名,然后是要为其创建别名的命令。例如:行aliasls='ls-A-F-B--human--color'导致Bashshell将ls命令解释为ls-A-F-B--human--color。您不仅限于重新定义现有命令,还可以创建自己的别名:aliasll='ls-l'aliasla='ls-A'aliaslh='ls-h'要使别名起作用,shell必须知道.bash_aliases配置文件存在。在编辑器中打开.bashrc文件(如果不存在则创建它),并包含以下代码块:if[-e$HOME/.bash_aliases];然后source$HOME/.bash_aliases当一个新的Bashshell启动时),Bash加载.bash_aliases到你的环境中。你可以关闭并重新启动你的Bash会话,或者只是强制它这样做:$source~/.bashrc如果你忘记了你是否有别名命令,which命令可以告诉你:$whichlsaliasls='ls-A-F-B--human--color'/usr/bin/ls如果使用选项将ls命令别名为ls命令,则可以通过在ls前加上反斜杠来覆盖别名。例如,在示例别名中,使用-B选项隐藏了备份文件,这意味着无法使用ls命令显示备份文件。可以覆盖此别名以查看备份文件:$lsbarbazfoo$\lsbarbazbaz~foo只做一件事,做得很好使用。有关更多选项,请参阅GNU系统上的infols或GNU或BSD系统上的manls。您可能会觉得奇怪,一个以每个工具“只做一件事,做好”为前提的系统会搭载其最常用的命令和50个选项。但是ls只做一件事:它列出文件,这50个选项允许您控制接收列表的方式,而ls非常非常好地完成了这项工作。