我有一个名为 的目录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
文件,因此如上所示的目录应该足够了。但是,在相关情况下,文件以多种方式命名,但您.docx
ls -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))