通过十六进制值来循环排序名称,而不是ascii

时间:2014-11-14 09:58:58

标签: bash hex

我有这个:

for j in $i/*.ext ; do 
    #extra code         
done

我可以浏览目录$ i中以.ext结尾的所有文件。 根据ascii命令处理文件。 000001.ext会在000002.ext之前出现 - 很好。 但是,问题是,我的文件有十六进制名称。我希望00000c.ext在000060.ext之前出现 - 我想保持文件名相同。

有没有办法获得for循环的功能,但是对传入的'进行排序。文件名以十六进制顺序?

更新 - 当我回显$ j时,我得到此输出,我需要在60之前的c。

00000004.ext
00000005.ext
000000060.ext
0000000c.ext

2 个答案:

答案 0 :(得分:0)

您只需在数字的开头添加零即可进行正常排序:

ls | perl -lne 'chomp; $old = $_; s/^/0/ while 30 > length; print "$_\t$old"' \
   | sort | cut -f2 \
   | while read j ; do
    ...
done

如果您的文件名包含换行符或标签,则无法使用。

如果您希望能够指定通配符掩码,可以使用以下内容:

ls path/*.out \
    | perl -lne 'chomp;
                 $old = $_;
                 s=/([0-9a-f]+)[^/]*$="/" . (0 x (30 - length $1)) . $1=e;
                 print "$_\t$old"' \
    | sort | cut -f2 \
    | while read j ; do 
          ...
      done

答案 1 :(得分:0)

如果您使每个号码具有相同的长度(例如8个字符),则在前面添加0x,您可以告诉sort为您执行此操作。

变化:

00000004.ext
00000005.ext
000000060.ext
0000000c.ext

0x00000004.ext
0x00000005.ext
0x00000060.ext
0x0000000c.ext

然后ls -1 | sort -n会给你你想要的东西:

0x00000004.ext
0x00000005.ext
0x0000000c.ext
0x00000060.ext

-n告诉sort进行数字排序。

最后,您需要将字符串放入已知的数字格式,以便能够以数字方式对它们进行排序。

XT