如何重命名所有文件而不覆盖?
How to rename all the files and no overwriting?
我知道如何用数字重命名文件夹中的所有文件:
i=1
for f in *.jpg
do
NEW_NAME=$( printf "%05d.jpg" $i )
# echo mv "$f" "$( printf "%05d.jpg" $i )"
mv -n "$f" "$NEW_NAME"
((i++))
done
所以我所有的文件都会被重命名,但是如果我有一个像 0004.jpg
这样的文件,它不会将文件重命名为 n+1。如果名称存在,我试图添加一个循环来增加 i
:
i=1
for f in *.jpg
do
NEW_NAME=$( printf "%05d.jpg" $i )
# echo mv "$f" "$( printf "%05d.jpg" $i )"
mv -n "$f" "$NEW_NAME"
MV=$?
while [ $MV -ne 0 ]
do
((i++))
NEW_NAME=$( printf "%05d.jpg" $i )
mv -n "$f" "$NEW_NAME"
MV=$?
done
((i++))
done
不过好像不行。有什么帮助吗?
你的问题是 mv -n
returns 即使文件已经存在也是零。
我很想这样做:
i=1
mkdir .newnames
for f in *.jpg
do
NEW_NAME=$( printf "%05d.jpg" $i )
# echo mv "$f" "$( printf "%05d.jpg" $i )"
mv "$f" ".newnames/$NEW_NAME"
((i++))
done
mv .newnames/* .
rmdir .newnames
基本上,通过将文件移动到临时目录(前导 .
(点)防止 for 循环尝试重命名它),您消除了文件名冲突的可能性。
我知道如何用数字重命名文件夹中的所有文件:
i=1
for f in *.jpg
do
NEW_NAME=$( printf "%05d.jpg" $i )
# echo mv "$f" "$( printf "%05d.jpg" $i )"
mv -n "$f" "$NEW_NAME"
((i++))
done
所以我所有的文件都会被重命名,但是如果我有一个像 0004.jpg
这样的文件,它不会将文件重命名为 n+1。如果名称存在,我试图添加一个循环来增加 i
:
i=1
for f in *.jpg
do
NEW_NAME=$( printf "%05d.jpg" $i )
# echo mv "$f" "$( printf "%05d.jpg" $i )"
mv -n "$f" "$NEW_NAME"
MV=$?
while [ $MV -ne 0 ]
do
((i++))
NEW_NAME=$( printf "%05d.jpg" $i )
mv -n "$f" "$NEW_NAME"
MV=$?
done
((i++))
done
不过好像不行。有什么帮助吗?
你的问题是 mv -n
returns 即使文件已经存在也是零。
我很想这样做:
i=1
mkdir .newnames
for f in *.jpg
do
NEW_NAME=$( printf "%05d.jpg" $i )
# echo mv "$f" "$( printf "%05d.jpg" $i )"
mv "$f" ".newnames/$NEW_NAME"
((i++))
done
mv .newnames/* .
rmdir .newnames
基本上,通过将文件移动到临时目录(前导 .
(点)防止 for 循环尝试重命名它),您消除了文件名冲突的可能性。