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

Bash 按文件名排列文件列表,但保留路径,bash,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.

我需要按文件名排列文件列表。目前我的订购方式如下:

» 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
在bash中,使用标准unix工具是否有一种简单的方法可以做到这一点?

如果所有文件的目录深度都相同(在您的示例中为3个),则以下方法可以工作:

find . -name "*.fixtures.json" | sort -t/ -k 4n
如果所有文件的目录深度相同(在您的示例中为3),则以下操作将起作用:

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

将其附加到查找中以使用:

输出:

./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 ./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
:整行参数


将其附加到查找中以使用:

输出:

./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 ./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
:整行参数


如果深度不是固定的,你可以使用这样的东西

$ 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

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

如果深度不固定,则使用类似的方法

$ 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

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

要使其与深度无关,您可以搜索并查找数字,并将其前置到以下行:
find…|sed's、./\([0-9][0-9]*\)-、\1&、“| sort-n | cut-d”'-f2-
@that otherguy谢谢你的提示!另一种选择似乎是使用
awk
sort-k
不支持负索引。事实上,深度可以变为独立于深度,您可以搜索和查找数字,并将其前置到以下行:
find…|sed's、./\([0-9][0-9]*\)-、\1&、“| sort-n | cut-d”'-f2-
@that otherguy谢谢你的提示!另一种选择似乎是使用
awk
sort-k
不支持负索引。第一个sed正在更改路径分隔符,对吗?是的,因为sed是贪婪的,它会将最后一个路径分隔符从文件名中分离出来。谢谢,很有趣。第一个sed正在更改路径分隔符,对吗?是的,因为sed很贪婪,它会将最后一个路径分隔符从文件名中分离出来。这非常干净,我喜欢。你给我一直在做的事起了个名字!这很干净,我喜欢。你给我一直在做的事起了个名字!