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

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

说在给定的目录中我得到了

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

我寻求狂欢获取名称大于或小于给定参数的文件列表的方法,例如:

$ my_finder lt N00.P003

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

$ my_finder gt N00.P003

应返回N00.P004N01.P000N01.P001并且N01.P002

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

答案1

绝不曾经迭代ls输出!

这是我的建议:

for fn in *; do test "$fn" -$1 "$2" && echo "$fn"; done

编辑:

抱歉。以上有效仅有的如果 $fn 和 $2 是数字。您必须将 -$1 替换为 $op,并在循环前面添加一个选择器。op="<"op=">"取决于 $1 是ltgt,分别。

答案2

不幸的是,这种技术/usr/bin/test不支持STRING > STRING,但是 shell 内置test 所以我们必须调用 shell 才能使用find -exec并避免循环:

find $PWD -type f -exec sh -c 'test "{}" "<" "$PWD/N00.P004"' \; -print

问题仍然是反复生成 shell 是否比运行循环更有效。但是,使用此技术的主要优势是您可以在没有管道的情况下进行递归处理。

您可以创建一个使用此技术的函数,并允许您使用gt和,lt而不必传递引用<>

my_finder () { 
    local op=$1
    case "$op" in
        "gt") op='>';;
        "lt") op='<';;
           *) echo "Invalid operator"; return 1;;
    esac
    find $PWD -type f -exec sh -c 'test "{}" "$op" "$PWD/$2"' \; -print
}

用法:

$ my_finder gt N00.P003
/home/tzury/Desktop/sandbox/N00.P004
/home/tzury/Desktop/sandbox/N01.P000
/home/tzury/Desktop/sandbox/N01.P001
/home/tzury/Desktop/sandbox/N01.P002

答案3

for num in {001..003} ;do ls N00.P"$num"; done

将 003 替换为您要设置的限制。

相关内容