如何为一个目录中的文件添加数字?
在一个目录中我有如下文件:
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
答案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
,您还可以使用3d
etc 来获取另一个前导 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