说在一个给定的目录,我得到了
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.P000 , N00.P001和N00.P002
$ my_finder gt N00.P003
应返回N00.P004 , N01.P000 , N01.P001和N01.P002
我正在考虑迭代for name in $(ls) while $name != $2 , while $name != $2但相信有更好的方法
永远不要迭代ls输出!
这是我的build议:
for fn in *; do test "$fn" -$1 "$2" && echo "$fn"; done
编辑:
抱歉。 上述工作只有 $ fn和$ 2是数字。 你必须用$ opreplace – $ 1,并在循环前加上一个select器。 op="<"或op=">"取决于$ 1,分别是lt或gt 。
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一个使用这种技术的函数,并允许你使用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