我需要按文件名订购文件列表。目前我这样订购:
» 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工具在bash中有一种简单的方法吗?
答案 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
我添加了一个虚拟记录来验证排序。假设文件名或路径中没有空格。