在bash脚本循环中将目录命名为0001而不是1


10

在以下bash脚本中,如果j = 0000,我如何更改以下bash脚本以使目录命名为0001、0002,...?实际上它使dirs命名为1,2,3

for i in *.jpg; do let j+=1 ; mkdir $j ; done

谢谢!

Answers:


13

您当前的脚本仅使用一个十进制值-显然会转换为该值而没有前导零。

您必须将字符串填充为4个字符的长度,并带有前导零。您可以通过使用反引号``来获取printf调用的结果printf %04d $j

因此,您应该具有完整的命令:

for i in *.jpg; do let j+=1; mkdir `printf %04d $j`; done

来源: StackOverflow bash-在字符串中填充零

(如果您想要更深入的解决方案,显然也可以看到该问题的进一步答案,但这绝对适用于此用例。)


5

使用bash,最佳选择是:

mkdir {0001..0666}

创建名称00010666(带有零填充)的目录。

如果你想要的目录命名prefix0001suffixprefix0002suffix......那么:

mkdir prefix{0001..0666}suffix

会做。

如果只需要奇数目录名

mkdir {0001..0666..2}

依此类推...请参见参考手册中的Brace Expansionbash

正如FEichinger指出的那样,您需要事先知道目录的数量。如果您想要一个接近您的解决方案,但真正安全且使用更现代的bash惯用语的解决方案:

for i in *.jpg; do ((++j)); mkdir $(printf "%04d" $j) ; done

这仅对要创建的先前已知数量的目录有用。通常,使用编号目录时,您处于动态上下文中-这意味着它应该在运行时确定数量,因此仍然需要字符串填充。但是,取决于特定的用例。
user98085

@FEichinger对!帖子进行了相应的编辑。
gniourf_gniourf 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.