我有诸如此类的文件
a
bb
ccc
abc
emrls
我想重命名它们,以便在对它们进行排序(例如,按字典顺序)后,每个文件都会获得以下名称:
00001
00002
00003
etc
其中 0 填充的位数是预先指定的,例如上述情况中的 6(假设我们知道需要多少位数)。
由于我最喜欢的 shell 是,所以我对受益于 的功能(也许使用's ?)zsh
的解决方案感兴趣。我也对与 Bash 兼容的解决方案感兴趣。zsh
zsh
zmv
答案1
您可以使用l
参数扩展标志在左侧填充一个数字。
i=0; for x in *; do ((++i)); mv -- $x new/${(l:6::0:)i}; done
有一种相对简单的方法可以仅使用 POSIX 功能来做到这一点:从 1000001(6 位数字)而不是 1 开始编号,并去掉前导1
.它不太简单,但短了几个字符。
i=1000000; for x in *; do i=$((i+1)); mv -- "$x" new/${i#1}; done
如果您想利用,可以使用在替换文本内zmv
递增的算术表达式。i
i=0; zmv '*' '${(l:6::0:)$((++i))}'
i=1000000; zmv '*' '${$((++i))#1}'
添加o
全局限定符如果您需要以不同的顺序对文件进行排序。对于,当模式包含 glob 限定符时,zmv
您需要传递标志。-Q
答案2
使用这个 bash 片段。
[centos@centos new]$ touch a bb ccc dddd eee f gh i
[centos@centos new]$ touch abc emrls cdg sf
[centos@centos new]$ touch ABC A BB CCC DD GI KLM kmna kabc mas nas san fin zoo
[centos@centos new]$ \ls -1
a
A
abc
ABC
bb
BB
ccc
CCC
cdg
DD
dddd
eee
emrls
f
fin
gh
GI
i
kabc
KLM
kmna
mas
nas
san
sf
zoo
[centos@centos new]$ a=0; for i in *; do a=$(($a+1)); b=`printf "%06d" $a`; mv -v ${i} ${b}; done
`a' -> `000001'
`A' -> `000002'
`abc' -> `000003'
`ABC' -> `000004'
`bb' -> `000005'
`BB' -> `000006'
`ccc' -> `000007'
`CCC' -> `000008'
`cdg' -> `000009'
`DD' -> `000010'
`dddd' -> `000011'
`eee' -> `000012'
`emrls' -> `000013'
`f' -> `000014'
`fin' -> `000015'
`gh' -> `000016'
`GI' -> `000017'
`i' -> `000018'
`kabc' -> `000019'
`KLM' -> `000020'
`kmna' -> `000021'
`mas' -> `000022'
`nas' -> `000023'
`san' -> `000024'
`sf' -> `000025'
`zoo' -> `000026'
[centos@centos new]$