Linux shell脚本以在文件名前添加前导零

21 浏览
0 Comments

Linux shell脚本以在文件名前添加前导零

我有一个包含大约1,700个文件的文件夹。它们的命名方式都像1.txt1497.txt。我想将所有文件重命名为四位数的文件名。

例如,23.txt变为0023.txt

有没有一个能够做到这一点的shell脚本?或者一个相关的问题:如何用grep只匹配包含\d.txt的行(即一个数字,然后是一个句点,然后是字母txt)?

以下是我目前的代码:

for a in [需要帮助的命令]
do
  mv $a 000$a
done

基本上,运行这个代码三次,每次使用不同的命令找到一位数、两位数和三位数的文件名(初始零的数量改变)。

0
0 Comments

问题的出现原因是需要给文件名添加前导零,但是现有的脚本在处理特定情况下存在问题。解决方法是修改脚本中的代码,以解决这些问题。

问题的解决方法如下:

1. 对于以数字开头的文件名,可以使用以下命令:

for a in [0-9]*.txt; do
    mv $a `printf %04d.%s ${a%.*} ${a##*.}`
done

这个命令会将文件名中的数字部分格式化为四位数,并保留原文件的扩展名。

2. 对于不以数字开头的文件名,可以使用以下命令:

X=1;
for i in *.txt; do
  mv $i $(printf %04d.%s ${X%.*} ${i##*.})
  let X="$X+1"
done

这个命令会给文件名添加前导零,并保留原文件的扩展名。

需要注意的是,现有的脚本在处理特定情况下存在问题。例如,如果文件名以零开头,脚本会将其视为八进制常量处理,导致文件名出现错误。为了解决这个问题,可以将代码中的`${a%.*}`修改为`$((10#${a%.*}))`,以将数字转换为十进制。

另外,建议在使用`ls -1 *.txt | sort -V`命令时,以保持文件顺序的一致性。

更多关于此的问题可以参考以下链接:

- [Bash script to pad file names](https://stackoverflow.com/questions/55754)

- [Extract filename and extension in bash](https://stackoverflow.com/questions/965053)

0
0 Comments

问题出现的原因是输入的文件名没有前导零,而需要将文件名改为带有前导零的格式。解决方法是使用Shell脚本编写一个循环来遍历所有的txt文件,并使用printf命令将文件名中的数字格式化为带有前导零的格式。如果文件名已经是带有前导零的格式,则不进行任何操作。代码中还需要添加引号来处理文件名中可能存在的空格,避免出现错误。

0
0 Comments

问题的出现原因是需要对文件名进行重命名,将文件名前面加上前导零。解决方法是使用Linux shell脚本,并结合Perl表达式来完成重命名操作。具体的解决方法是使用rename脚本(在某些情况下是prename)来实现文件重命名,该脚本有时会与Perl一起安装。脚本会跳过重命名操作,如果存在重名的文件。

下面的命令只会对文件名中有四位或更少数字,并以".txt"扩展名结尾的文件进行重命名。它不会对不符合该模式的文件进行重命名,也不会对超过四位数字的文件名进行截断。

rename 'unless (/0+[0-9]{4}.txt/) {s/^([0-9]{1,3}\.txt)$/000$1/g;s/0*([0-9]{4}\..*)/$1/}' *

以下是一些示例:

原始文件名      重命名后文件名
1.txt       0001.txt
02.txt      0002.txt
123.txt     0123.txt
00000.txt   00000.txt
1.23.txt    1.23.txt

其他提供的答案可能会尝试重命名不符合模式的文件,对包含非数字字符的文件名会产生错误,进行重命名时可能会产生重名的文件,尝试并失败于重命名文件名中包含空格等其他问题。

但是,如果文件名中包含空格或非数字字符不在问题的范围内,那又有谁会在乎呢?如果提问者想要编写一个通用的脚本,他会在问题中明确说明,并且答案也会相应地提供。

我的回答通常会做两件事。一是尝试回答提问者的问题。二是尝试提供对以后查看该问题的人可能有用的附加信息。

感谢提供这个回答,排名第一的回答没有解决我的具体问题,但正如你所提到的,你提供了一个更通用和广泛的答案,这对我很有帮助。谢谢。

0