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 

我寻求一种bash方式来获取文件列表,这些文件的名字要么比给定的参数更大,要么更小,例如:

 $ my_finder lt N00.P003 

应返回N00.P000N00.P001N00.P002

 $ my_finder gt N00.P003 

应返回N00.P004N01.P000N01.P001N01.P002

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

永远不要迭代ls输出!

这是我的build议:

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

编辑:

抱歉。 上述工作只有 $ fn和$ 2是数字。 你必须用$ opreplace – $ 1,并在循环前加上一个select器。 op="<"op=">"取决于$ 1,分别是ltgt

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

将003replace为您要放置的限制。

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

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

问题是重复产生一个shell是否比运行一个循环更有效率。 然而,使用这种技术的主要优点是你可以在没有pipe道的情况下进行recursion处理。

你可以创build一个使用这种技术的函数,并允许你使用gtlt而不必通过引用<>

 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