我有一个名为all_files
. 我的脚本位于主目录中main_dir
(all_files 是 的子目录main_dir
)。
all_files
包含 pdf 文件和只有 1 个 docx 文件。我想以相反的字母顺序输出所有 pdf 文件的文件名。我试过这个:
tail -r all_files
但这也包括我想排除的 docx 文件,它不能完成这项工作。有谁知道如何做到这一点?
我有一个名为all_files
. 我的脚本位于主目录中main_dir
(all_files 是 的子目录main_dir
)。
all_files
包含 pdf 文件和只有 1 个 docx 文件。我想以相反的字母顺序输出所有 pdf 文件的文件名。我试过这个:
tail -r all_files
但这也包括我想排除的 docx 文件,它不能完成这项工作。有谁知道如何做到这一点?
ls
接受-r
/--reverse
以反转其输出的顺序。由于默认情况下它的输出是按字母顺序排列的,因此反转它应该可以满足您的要求:这显示了每个文件名的前缀
all_files/
。如果您不想这样做,可以使用:括号导致命令在子shell 中运行,因此在
all_files
命令运行后更改目录的效果不会持续存在(即,您在之后停留在原处)。的附加--
参数ls
指示选项的结束,这使得它即使在其中一个.pdf
文件的名称以开头的奇怪情况下也能工作-
,因此可以否则将其解释为选项ls
而不是文件名参数。如果您想每行列出一个文件名,无论是否
ls
输出到终端(并且无论终端的宽度如何),您也可以传递ls
该-1
选项:(将
-1
and-r
选项作为两个单独的参数传递也可以,它们可以按任意顺序传递。也就是说,-1r
,-r1
,-1 -r
,-r -1
都可以工作并且具有相同的效果。)请注意,
-r
/--reverse
不应与-R
/混淆--recursive
,后者也会列出所有子目录及其子目录中的文件,依此类推。一些程序接受-r
表示“递归”的选项,但(至少在 Ubuntu 中)ls -r
执行反向列表,而不是递归列表。ls --reverse
你可以根据自己的喜好写出来。例如:由于您拥有
.pdf
除一个带有.docx
扩展名的文件之外的所有文件,ls -r
因此如上所示的目录应该足够了。但是,在相关情况下,有多种方式命名的文件,但您只想省略那些以 . 结尾的文件.docx
,您可以改用它:这使用了一个称为“扩展通配符”的 Bash 功能。这在交互式 shell 中默认启用,但在 shell 脚本中默认不启用。您可以使用 来检查它是否已启用
shopt extglob
,使用 启用(“设置”)它,使用shopt -s extglob
禁用(“取消设置”)它shopt -u extglob
。您可以使用子shell 为一个命令启用它,如上所示cd
。使用该技术,上述两个命令变为: