查找名称小于或大于给定参数的文件

Tzu*_*hay 6 bash find

假设在给定的目录中我得到了

tzury@x200:~/Desktop/sandbox$ ls -l
total 20
drwxr-xr-x 2 tzury tzury 4096 2011-03-09 10:19 N00.P000
drwxr-xr-x 2 tzury tzury 4096 2011-03-09 10:19 N00.P001
drwxr-xr-x 2 tzury tzury 4096 2011-03-09 10:19 N00.P002
drwxr-xr-x 2 tzury tzury 4096 2011-03-09 10:19 N00.P003
drwxr-xr-x 2 tzury tzury 4096 2011-03-09 10:19 N00.P004
drwxr-xr-x 2 tzury tzury 4096 2011-03-09 10:19 N01.P000
drwxr-xr-x 2 tzury tzury 4096 2011-03-09 10:19 N01.P001
drwxr-xr-x 2 tzury tzury 4096 2011-03-09 10:19 N01.P002
Run Code Online (Sandbox Code Playgroud)

我寻求一种bash方法来获取其名称大于或小于给定参数的文件列表,例如:

$ my_finder lt N00.P003
Run Code Online (Sandbox Code Playgroud)

将返回N00.P000N00.P001并且N00.P002

$ my_finder gt N00.P003
Run Code Online (Sandbox Code Playgroud)

应返回N00.P004, N01.P000,N01.P001N01.P002

我正在考虑迭代for name in $(ls)while $name != $2但相信有更优雅的方法

pep*_*uan 3

永远不要迭代ls输出!

这是我的建议:

for fn in *; do test "$fn" -$1 "$2" && echo "$fn"; done
Run Code Online (Sandbox Code Playgroud)

编辑:

对不起。当 $fn 和 $2 为数字时,上述方法才有效。您必须将 -$1 替换为 $op,并在循环前面添加一个选择器。op="<"或分别op=">"取决于 $1 是ltgt

  • ls 的问题在于,它会愉快地列出名称包含空格或其他空格的文件,因此此类文件的名称将被视为单独的单词。除非您注意实际包装每个文件。现在,分词发生在通配符之前。因此,当将“*”送入 for 循环时,它不会经历分词。 (2认同)