查找并排序数字文件名

查找并排序数字文件名

我尝试查找匹配的文件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为每个匹配文件创建一个进程的语法的替代方法。sortcutfind ... -exec some_tool ... \;some_tool

相关内容