如何在文件名前面添加升序数字,如 1_ 2_?

如何在文件名前面添加升序数字,如 1_ 2_?

如何为一个目录中的文件添加数字?

在一个目录中我有如下文件:

fileA
fileB
fileC
fileD

我想在它们前面添加升序数字,如下所示:

1_fileA
2_fileB
3_fileC
4_fileD

先感谢您。

答案1

解决方案之一:

cd <your dir>然后在 bash 中运行(在命令行中复制并粘贴):

n=1; for f in *; do mv "$f" "$((n++))_$f"; done

Bash 脚本案例:

#!/bin/bash
n=1
for f in *
do
  if [ "$f" = "rename.sh" ]
  then
    continue
  fi
  mv "$f" "$((n++))_$f"
done

将其另存为要rename.sh重命名的文件的目录,chmod +x rename.sh然后运行它./rename.sh

答案2

  1. 在 Nautilus 中打开您的目录。

  2. 突出显示所有文件。

  3. 右键单击并从上下文菜单中选择“重命名...”。

  4. 在重命名对话框中,单击+Add按钮。

  5. 在“自动编号”下选择“1,2,3,4”

  6. 然后,在重命名对话框的文本输入字段中,在“[1, 2, 3]”和“[原始文件名]”之间插入下划线“_”字符。

    它应该看起来像“[1, 2, 3]_[原始文件名]”

  7. 单击Rename按钮。

在重命名对话框中选择“1,2,3,4”

重命名的文件

答案3

如果有超过 9 个文件,我将使用printf填充数字来获得预期的排序顺序,如下所示

n=0
for f in *
    do printf -v new "%2d$((++n))_$f"
    echo mv -v -- "$f" "$new"
done

echo当看到正确结果时删除。

解释

在这行中,do printf -v new "%2d$((++n))_$f"我们为新文件名创建一个格式并将其放入变量中new

%2d是 2 位十进制数。除了2d,您还可以使用3detc 来获取另一个前导 0(如果您有超过 99 个文件)。

((++n))增加变量n(我们在脚本开始时将其设置为 0)。由于每次运行循环时都会迭代一次,因此文件的名称前缀会递增。

-v打印mv将要改变的内容。

--mv语句中是为了防止以 开头的文件名-被解释为选项。

答案4

一种选择是

cd /path/to/folder/
ls -1v | rename -n -v 's/^/sprintf("%02d_", ++our$i)/e'
  • 这种方法很好,但文件名中带有换行符“\n”的情况除外。开关“-1v”处理空格和制表符,

  • 此处发布的其他命令会用数字更改文件的顺序,例如 10a 在 1a 之前。

  • 无论哪种情况都适用。

我花了一些时间测试所有这些命令。结果如下。

$ ls
001abc.txt  '10a bc.txt'   1abc.txt  '2ab c.txt'  'a'$'\t''bc.txt'

$ ls -1v | rename -n -v 's/^/sprintf("%02d_", ++our$i)/e'
Reading filenames from file handle (GLOB(0x55cb57991b28))
rename(001abc.txt, 01_001abc.txt)
rename(1abc.txt, 02_1abc.txt)
rename(2ab c.txt, 03_2ab c.txt)
rename(10a bc.txt, 04_10a bc.txt)
rename(a    bc.txt, 05_a    bc.txt)

$ n=1; for f in *; do echo mv "$f" "$((n++))_$f"; done
mv 001abc.txt 1_001abc.txt
mv 10a bc.txt 2_10a bc.txt
mv 1abc.txt 3_1abc.txt
mv 2ab c.txt 4_2ab c.txt
mv a    bc.txt 5_a  bc.txt

$ for f in *;     do printf -v new "%2d$((++n))_$f";     echo mv -v -- "$f" "$new"; done
mv -v -- 001abc.txt  09_001abc.txt
mv -v -- 10a bc.txt  010_10a bc.txt
mv -v -- 1abc.txt  011_1abc.txt
mv -v -- 2ab c.txt  012_2ab c.txt
mv -v -- a  bc.txt  013_a   bc.txt

$ ./rename.sh 
mv 001abc.txt 1_001abc.txt
mv 10a bc.txt 2_10a bc.txt
mv 1abc.txt 3_1abc.txt
mv 2ab c.txt 4_2ab c.txt
mv a    bc.txt 5_a  bc.txt

$ rename -n 'our $i; if (!$i) {$i++}; s/^/sprintf("%d_", $i++)/e' *
rename(001abc.txt, 1_001abc.txt)
rename(10a bc.txt, 2_10a bc.txt)
rename(1abc.txt, 3_1abc.txt)
rename(2ab c.txt, 4_2ab c.txt)
rename(a    bc.txt, 5_a bc.txt)
rename(rename.sh, 6_rename.sh)

$ for f in *;     do printf -v new "%2d$((++n))_$f";     echo mv -v -- "$f" "$new"; done
mv -v -- 001abc.txt  01_001abc.txt
mv -v -- 10a bc.txt  02_10a bc.txt
mv -v -- 1abc.txt  03_1abc.txt
mv -v -- 2ab c.txt  04_2ab c.txt
mv -v -- a  bc.txt  05_a    bc.txt
mv -v -- rename.sh  06_rename.sh

相关内容