Unix使用通配符查找和排序

时间:2017-05-19 13:47:21

标签: bash sorting unix find

让我们假设我有一个包含某个xml文件的文件夹:

  • a-as-jdbc.xml
  • z-as-jdbc.xml
  • fa-jdbc.xml
  • config.xml
  • router.xml
  • paster.xml
  • cleardown.xml

我想使用通配符和我的自定义排序逻辑通过某种排序命令来管道查找。

那是因为我希望返回的文件名顺序始终相同。

例如,我一直想要:

  • 1个元素:" config.xml"
  • 2元素:" *。as-jdbc.xml"
  • 3元素:" -jdbc.xml" (不包括模式" .as-jdbc")
  • 4元素:" router.xml"
  • 等......

我怎样才能做到这一点?任何的想法? 我过去使用数组做过但不记得我现在的确切方式......

由于

3 个答案:

答案 0 :(得分:3)

不太漂亮但是:

rules.txt:

config\.xml
.*\.as\-jdbc\.xml
^[^-]*\-jdbc\.xml
router\.xml

命令:

$ find /path/to/dir > /tmp/result.txt
$ cat rules.txt | xargs -I{} grep -E "{}" /tmp/result.txt
config.xml
a-as-jdbc.xml
z-as-jdbc.xml
fa-jdbc.xml
router.xml

您必须添加pastercleardown

所需的其他两种模式

答案 1 :(得分:1)

在Python这样的高级语言中执行此操作肯定更容易。

这不是排序问题;这是一个订购问题。因此,您无法使用Unix排序命令。

不可避免的是,无论如何你都需要进行4次传球,所以我会这样做:

$ find /tmp/alex -name config.xml ; \
> find /tmp/alex -name *-as-jdbc.xml ; \
> find /tmp/alex \( \! -name *-as-jdbc.xml -a -name *-jdbc.xml \) ; \
> find /tmp/alex \( -type f -a \! -name config.xml -a \! -name *-jdbc.xml \)
/tmp/alex/config.xml
/tmp/alex/a-as-jdbc.xml
/tmp/alex/z-as-jdbc.xml
/tmp/alex/fa-jdbc.xml
/tmp/alex/cleardown.xml
/tmp/alex/paster.xml
/tmp/alex/router.xml

或者使用grep:

$ find /tmp/alex -type f > /tmp/aaa
$ grep /config.xml /tmp/aaa ; \
> grep -- -as-jdbc.xml /tmp/aaa ; \
> grep -- -jdbc.xml /tmp/aaa | grep -v -- -as-jdbc.xml ; \
> egrep -v '(?:config.xml|-jdbc.xml)' /tmp/aaa
/tmp/alex/config.xml
/tmp/alex/a-as-jdbc.xml
/tmp/alex/z-as-jdbc.xml
/tmp/alex/fa-jdbc.xml
/tmp/alex/cleardown.xml
/tmp/alex/paster.xml
/tmp/alex/router.xml

答案 2 :(得分:0)

我建议您按照您想要的顺序添加查找命令:

$ find . -name config.xml; \
> find . -name \*.as-jdbc.xm; \
> find . -name \*-jdbc.xml -a ! -name \*as-jdbc.xml; \
> find . -name router.xml; \
> ... and so on.