这是文件列表:
some.string_100_with_numbers.in-it.txt
some.string_101_with_numbers.in-it.txt
some.string_102_with_numbers.in-it.txt
some.string_23_with_numbers.in-it.txt
some.string_24_with_numbers.in-it.txt
some.string_25_with_numbers.in-it.txt
现在我想以数字为单位。从 *23 *开始,然后以 *102 *。
结束我尝试了-n
和-g
。-t
在这些混乱的字符串中无济于事。
我可以忽略一个选项的领先字符串,还是必须聪明且脚本?
使用 ls -lv
从"人"页面:
-v natural sort of (version) numbers within text
尝试以下内容:
sort -t '_' -k 2n
-
-t '_'
(将定界符设置为下划线字符) -
-k 2n
(使用数字订购的第二列列表)
demo 。
如果可用,只需使用sort -V
即可。这是版本编号的一种类型,但可以作为"自然排序"选项运行良好。
$ ff=$( echo some.string_{100,101,102,23,24,25}_with_numbers.in-it.txt )
没有排序:
$ for f in $ff ; do echo $f ; done
some.string_100_with_numbers.in-it.txt
some.string_101_with_numbers.in-it.txt
some.string_102_with_numbers.in-it.txt
some.string_23_with_numbers.in-it.txt
some.string_24_with_numbers.in-it.txt
some.string_25_with_numbers.in-it.txt
sort -v:
$ for f in $ff ; do echo $f ; done | sort -V
some.string_23_with_numbers.in-it.txt
some.string_24_with_numbers.in-it.txt
some.string_25_with_numbers.in-it.txt
some.string_100_with_numbers.in-it.txt
some.string_101_with_numbers.in-it.txt
some.string_102_with_numbers.in-it.txt
在一般情况下,尝试schwartzian变换。
简要地,将数字分解为自己的字段,对此进行排序,然后丢弃添加的字段。
# In many shells, use ctrl-v tab to insert a literal tab after the first 2
sed 's/^([^0-9]*)([0-9][0-9]*)/2 12/' file |
sort -n |
cut -f2-
如果输入没有明显的分离器,则可以很好地工作,例如对于以下输入。
abc1
abc10
abc2
您希望在第一个之后将最后一行移动的位置。
不是直接的,但是您可以重命名文件零件(根据需要使用其他填充零)为前缀。
ex:1.txt,23.txt,2.TXT重命名为01.txt,23.txt,02.txt
现在ls默认输出是数值顺序01.txt02.TXT23.txt
一个简单的Python脚本可能会为您提供帮助。如果您愿意,您甚至可以使用Regex进行一次拍摄。
import glob
files = glob.glob('*[0-9]*.py')
print(files)
import os
for f in files:
# 64.smallest_word_window.py
parts = f.split('_')
number = str('%04d' % (int(parts[0])))+'_'
del parts[0]
new_parts = number + '_'.join( parts )
print(f'{new_parts}')
os.rename(f, new_parts)