我尝试查找匹配的文件time=*
,然后需要按数字排序显示它。
结果文件名将是:
first/path/time=001.jpg
first/path/time=002.jpg
second/path/time=001.jpg
...
我希望看到,
first/path/time=001.jpg
second/path/time=001.jpg
first/path/time=002.jpg
...
根据文件名的 3 位数字按数字排序。
现在我尝试过
find . -name time=* | rev | sort | rev
它对于个位数有效,但对于类似的数字则019
021
无效。
完整路径如下,
path/to/folder1/alpha=0.1_beta=0.2_gamma=1.0/time=001.jpg
path/to/folder1/alpha=0.1_beta=0.2_gamma=0.1/time=001.jpg
path/to/folder2/alpha=0.1_beta=0.2_gamma=0.1/time=001.jpg
.
.
.
我认为如果只使用最后 7 个字符对文件进行排序会最简单的。...001.jpg
010.jpg
但遗憾的sort
是不支持负索引来获取最后 6 个字符 :(
答案1
这应该可以做到:
find . -name 'time=*' | sort -t= -k3
但这是一种更安全的排序,正如 Kamil Maciorowski 的评论所言:
perl -C -F= -wnle 'push @a,[$_,split(/\./,$F[-1])]; END {$,="\n"; print map{$$_[0]} sort{$$a[1]<=>$$b[1]} @a}'
在之后的管道中使用它,find
而不是sort
在第一个管道中使用它。
答案2
我从命令行挑选了一些剩余的东西来快速完成 :-)
find . -name time="*" -exec ruby -e "s='{}'; puts s.split('=')[-1].split('.')[0]+s" \; |
sort -n | colrm 1 3
解释:
我的朋友 Ruby 将 find 给出的路径字符串存储为{}
并将其存储到变量 中s
。然后,她根据字符拆分字符串=
并保留最后一部分(结果数组中的索引 -1),例如002.jpg
。然后,她根据.
字符拆分此字符串并保留第一部分(结果数组中的索引 0),假设文件名为ddd.<ext>
,结果是三位数字部分,例如002
。
最后,她打印了此内容并添加了原始路径字符串。结果如下:
002./alpha=0.1_beta=0.2_gamma=1.0/path/time=002.jpg
001./alpha=0.1_beta=0.2_gamma=1.0/path/time=001.jpg
021./alpha=0.1_beta=0.2_gamma=0.1/path/time=021.jpg
001./alpha=0.1_beta=0.2_gamma=0.1/path/time=001.jpg
019./alpha=0.1_beta=0.2_gamma=0.1/path/time=019.jpg
附加的管道命令按数字顺序对输出进行排序(sort -n
),最后删除输出的前三列(colrm 1 3
)。
例子:
test$ find . -name time="*" -exec ruby -e "s='{}'; puts s.split('=')[-1].split('.')[0]+s" \;
| sort -n | colrm 1 3
./alpha=0.1_beta=0.2_gamma=0.1/path/time=001.jpg
./alpha=0.1_beta=0.2_gamma=1.0/path/time=001.jpg
./alpha=0.1_beta=0.2_gamma=1.0/path/time=002.jpg
./alpha=0.1_beta=0.2_gamma=0.1/path/time=019.jpg
./alpha=0.1_beta=0.2_gamma=0.1/path/time=021.jpg
答案3
假设没有路径疯狂到需要find ... -print0
:
find . -type f -name "time=*" | awk -F '=' '{ print $NF "=" $0 }' | sort -n | cut -d "=" -f 2-
我曾经awk
提取最后一个后面的部分=
,它输出完整的行额外的相关部分放在前面,用额外的 =
.例如:
001.jpg=path/to/folder1/alpha=0.1_beta=0.2_gamma=1.0/time=001.jpg
这些按数字排序sort
。然后cut
提取这个附加部分(第一个)之后的部分=
;这些是原始路径。
总共创建了四个进程:find
,,,,。使用awk
为每个匹配文件创建一个进程的语法的替代方法。sort
cut
find ... -exec some_tool ... \;
some_tool