Bash:mv删除文件,因为尽管重命名尚未完成,但文件仍然存在

时间:2018-11-05 17:22:19

标签: bash mv

它在Mac OS 10.11上。

批量重命名文件时,可能会发生文件删除。 示例:1.txt,2.txt,3.txt应该重命名为3.txt,2.txt,1.txt 按照常规方式,1.txt变为3.txt(删除原始的3.txt),2.txt 2.txt,然后3.txt(原始的1.txt)再次变为1.txt。仅保留1.txt和2.txt。

为禁止这种情况,第一步,我为所有输入名称添加了随机名称后缀;在第二步中,我将后缀名称更改为其最终输出名称。完整示例-请保存到sh文件并为您自己测试:

#!/bin/sh

set -u -x

echo 1 > 1.txt
echo 2 > 2.txt
echo 3 > 3.txt

InputFiles=(1.txt 2.txt 3.txt)
OutputFiles=(3.txt 2.txt 1.txt)

suffix="_rename_cnowjfo_"
i=0
count=3
while (( i < count )); do
    mv "${InputFiles[i]}" "${InputFiles[i]}$suffix"
    i=$(( i + 1 ))
done
#sleep 3
i=0
while (( i < count )); do
    mv -n "${InputFiles[i]}$suffix" "${OutputFiles[i]}"
    echo $?
    #sleep 0.5
    i=$(( i + 1 ))
done

重复两次({1..3} .txt-{3..1} .txt和{1..3} .txt-{3..1} .txt)以重置原始名称第一次可以正常运行,但是第二次,由于未知原因,删除了1.txt

第二次执行-v:

+ ((  i < count  ))
+ mv 1.txt 1.txt_rename_cnowjfo_
+ i=1
+ ((  i < count  ))
+ mv 2.txt 2.txt_rename_cnowjfo_
+ i=2
+ ((  i < count  ))
+ mv 3.txt 3.txt_rename_cnowjfo_
+ i=3
+ ((  i < count  ))
+ i=0
+ ((  i < count  ))
+ mv -n 1.txt_rename_cnowjfo_ 3.txt
+ echo 0
0
+ i=1
+ ((  i < count  ))
+ mv -n 2.txt_rename_cnowjfo_ 2.txt
+ echo 0
0
+ i=2
+ ((  i < count  ))
+ mv -n 3.txt_rename_cnowjfo_ 1.txt
+ echo 0
0
+ i=3
+ ((  i < count  ))

现在我取消注释上面的sleep命令,一切似乎都按预期工作。似乎,如果没有sleep命令,则mv可能即使退出也无法完成其工作。

如果我手动执行所有6条命令,也会发生同样的情况:

mv 1.txt 1.txt_rename_cnowjfo_; mv 2.txt 2.txt_rename_cnowjfo_; mv 3.txt 3.txt_rename_cnowjfo_; mv 1.txt_rename_cnowjfo_ 3.txt; mv 2.txt_rename_cnowjfo_ 2.txt; mv 3.txt_rename_cnowjfo_ 1.txt

在我测试的所有文件系统上都发生了同样的情况:MAC OS扩展,ExFAT和FAT16。

在未完全完成工作的情况下如何退出电视?

1 个答案:

答案 0 :(得分:1)

由于我的错,该解决方案非常简单-没有使用Shell检查最终结果,而是使用Finder应用程序检查了最终结果。 Finder似乎对快速的更改不知所措,并且仅在杀死并重新启动后会显示所有3个文件。 ls立即显示所有3个文件都已正确重命名。

从不依赖GUI来获取文件的可靠视图!