如何使用 bash 列出目录中的所有 pdf 文件并按字母倒序排列?

如何使用 bash 列出目录中的所有 pdf 文件并按字母倒序排列?

我有一个名为 的目录all_files。我的脚本位于主目录中main_dir(all_files 是 的子目录main_dir)。

all_files包含 pdf 文件和仅 1 个 docx 文件。我想以反向字母顺序输出所有 pdf 文件的文件名。我尝试了这个:

tail -r all_files

但其中也包括我想排除的 docx 文件,但它不起作用。有人知道怎么做吗?

答案1

ls接受-r/--reverse来反转其输出的顺序。由于其输出默认按字母顺序排列,因此反转它应该可以实现您想要的效果:

ls -r all_files/*.pdf

这将显示每个文件名的前缀all_files/。如果您不想这样做,可以使用:

(cd all_files && ls -r -- *.pdf)

括号使得命令在子 shell 中运行,这样all_files在命令运行后,将目录更改为的效果不会持续存在(即,您随后停留在原来的位置)。附加参数--to表示选项的结束,这使得它即使在某个文件的名称以 开头的ls奇怪情况下也能正常工作,因此可以将其解释为选项,而不是文件名参数。.pdf-ls

如果您想要每行列出一个文件名,无论是否ls输出到终端(并且不管终端的宽度如何),您也可以传递ls该选项:-1

ls -1r all_files/*.pdf
(cd all_files && ls -1r -- *.pdf)

(将-1-r选项作为两个单独的参数传递也是可行的,并且它们可以按任意顺序传递。也就是说,-1r-r1-1 -r-r -1都有效并且具有相同的效果。)

请注意,不要将-r/与/--reverse混淆,后者也会列出所有子目录中的文件,-R--recursive他们的子目录等等。有些程序接受-r表示“递归”的选项,但(至少在 Ubuntu 中)ls -r执行的是反向列表,而不是递归列表。您可以按照ls --reverse自己的喜好将其写出来。例如:

ls -1 --reverse all_files/*.pdf

由于除了一个带扩展名的文件外,您拥有所有.pdf文件,因此如上所示的目录应该足够了。但是,在相关情况下,文件以多种方式命名,但您.docxls -r仅有的想要省略以 结尾的那些.docx,你可以改用这个:

ls -r all_files/!(*.docx)
(cd all_files && ls -r -- !(*.docx))

这使用了 Bash 的一项功能,称为“扩展通配符”。此功能在交互式 shell 中默认启用,但在 shell 脚本中默认不启用。您可以使用 检查它是否已启用shopt extglob,使用 启用(“设置”)它shopt -s extglob,使用 禁用(“取消设置”)它shopt -u extglob。您可以使用子 shell 仅为一个命令启用它,如上所示cd。使用该技术,上述两个命令变为:

(shopt -s extglob; ls -r all_files/!(*.docx))
(shopt -s extglob; cd all_files && ls -r -- !(*.docx))

相关内容