按文件名排序文件列表,但保留路径

时间:2016-01-25 17:59:52

标签: bash

我需要按文件名订购文件列表。目前我这样订购:

» find . -name "*.fixtures.json" | sort
./my_registration/fixtures/0600-my_registration.fixtures.json
./soamgr/fixtures/0200-soamgr.fixtures.json
./soaprj/fixtures/0100-users.fixtures.json
./soaprj/fixtures/0110-permissions.fixtures.json
./soaprj/fixtures/0120-groups.fixtures.json

按完整路径排序(按预期方式)。

在这种情况下,我想按文件名排序(这样我的数字前缀是定义排序的前缀),保留路径信息。这是我需要的输出:

./soaprj/fixtures/0100-users.fixtures.json
./soaprj/fixtures/0110-permissions.fixtures.json
./soaprj/fixtures/0120-groups.fixtures.json
./soamgr/fixtures/0200-soamgr.fixtures.json
./my_registration/fixtures/0600-my_registration.fixtures.json

使用标准的unix工具在ba​​sh中有一种简单的方法吗?

3 个答案:

答案 0 :(得分:3)

将此附加到您的查找以使用Schwartzian transform

| awk -F/  '{print $NF "/" $0}' | sort -n | cut -d / -f 2-

输出:

./soaprj/fixtures/0100-users.fixtures.json
./soaprj/fixtures/0110-permissions.fixtures.json
./soaprj/fixtures/0120-groups.fixtures.json
./soamgr/fixtures/0200-soamgr.fixtures.json
./my_registration/fixtures/0600-my_registration.fixtures.json

AWK:

  

-F:设置字段分隔符

     

$NF:当前记录/最后一列中的字段数

     

$0:整个论点

答案 1 :(得分:1)

如果所有文件的目录深度相同(在您的示例中为3),则以下内容将起作用:

find . -name "*.fixtures.json" | sort -t/ -k 4n

答案 2 :(得分:1)

如果深度没有固定,你可以使用类似的东西

$ sed 's_.*/_& _' files | sort -k2n | sed 's_/ _/_'

./soaprj/fixtures/0100-users.fixtures.json
./soaprj/fixtures/0110-permissions.fixtures.json
./a/b/c/d/0115-dummy.json
./soaprj/fixtures/0120-groups.fixtures.json
./soamgr/fixtures/0200-soamgr.fixtures.json
./my_registration/fixtures/0600-my_registration.fixtures.json

我添加了一个虚拟记录来验证排序。假设文件名或路径中没有空格。