在一个文件夹中我有几个文件,如
name_1.txt
name_2.txt
name_12.txt
name_13.txt
我想在
中重命名它们name_1.txt -> name_1.txt
name_2.txt -> name_2.txt
name_12.txt -> name_3.txt
name_13.txt -> name_4.txt
以下代码部分完成了工作,但没有保留订单
#!/bin/sh
num=1
for file in *.txt; do
mv "$file" "$(printf "%u" $num).txt"
let num=$num+1
done
确实输出
name_1.txt -> 1.txt
name_2.txt -> 4.txt
name_12.txt -> 2.txt
name_13.txt -> 3.txt
如何修改名称和订单?谢谢!
答案 0 :(得分:2)
*.txt
扩展为name_12.txt name_13.txt name_1.txt name_2.txt
,因为这对计算机最有意义。你需要对它进行排序,以我们人性化的方式开始。 ls
命令可以使用自然排序ls -v *.txt
很好地完成此任务。
这意味着代码需要看起来像这样......
#!/bin/sh
num=1
for file in $(ls -v *.txt); do
mv "$file" "$(printf "%u" $num).txt"
let num=$num+1
done
答案 1 :(得分:0)
您可以分两步进行:
重命名所有数字长度相同的文件:
for file in name_?.txt ; do
if [[ -f ${file/_/_0} ]] ; then
echo "Can't rename $file: ${file/_/_0} already exists." >&2
exit 1
fi
mv "$file" "${file/_/_0}"
done
这会将name_1.txt
重命名为name_01.txt
等。
您也可以使用rename
,但有许多版本具有不同的语法,例如
rename _ _0 rename_?.txt
# or
rename 's/_/_0/' rename_?.txt
现在您可以使用已经尝试过的方法。
答案 2 :(得分:0)
将sort -n添加到代码
#!/bin/sh
num=1
for file in $(ls *.txt | sort -n) do
mv "$file" "$(printf "%u" $num).txt"
let num=$num+1
done