说在给定的目录中我得到了
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.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
但相信有更优雅的方法
答案1
绝不曾经迭代ls
输出!
这是我的建议:
for fn in *; do test "$fn" -$1 "$2" && echo "$fn"; done
编辑:
抱歉。以上有效仅有的如果 $fn 和 $2 是数字。您必须将 -$1 替换为 $op,并在循环前面添加一个选择器。op="<"
或op=">"
取决于 $1 是lt
或gt
,分别。
答案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 替换为您要设置的限制。