shell 用于重命名文件夹中的文件以保持顺序的脚本
shell script to rename files in folder keeping order
在一个文件夹中我有几个文件,例如
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
如何确定名称和顺序?谢谢!
*.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
您可以分两步进行:
重命名所有数字长度相同的文件:
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
现在您可以使用您已经尝试过的方法了。
在代码中添加 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
在一个文件夹中我有几个文件,例如
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
如何确定名称和顺序?谢谢!
*.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
您可以分两步进行:
重命名所有数字长度相同的文件:
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
现在您可以使用您已经尝试过的方法了。
在代码中添加 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