我有这个:
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
答案 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