如何让 mv 忽略重命名同名目录的情况

如何让 mv 忽略重命名同名目录的情况

我有一个 for 循环,其中有目录,命令mv会将相同的名称应用到其目录,其他目录有不同的名称,例如:

for i in {1..3};do
mv hg/ hg
done

有时hg/目录会与其他目录不同(例如dir/随着循环的进行),并且当名称不同时循环有效,但是当名称相同时我收到错误:

mv: cannot move ‘hg/’ to a subdirectory of itself, ‘hg/hg’

我想忽略此行为,并mv“假装”目录具有相同的名称并继续循环。请注意hgdir只是示例,实际目录在循环的每次迭代中都有不同的名称。

答案1

如果你想避免尝试将目录重命名为自身,你可以使用测试条件来防止这种情况发生

src='hg'
dst='hg'
[ "$src" != "$dst" ] && mv -f "$src" "$dst"

如果您认为其中一个目录名称可能有尾部斜杠,而另一个目录名称可能没有,则在应用测试之前删除所有尾部斜杠

[ "${src%/}" != "${dst%/}" ] && mv -f "$src" "$dst"

另一个更彻底但非 POSIX 的解决方案是检查两个路径是否引用相同的设备和 inode(即它们是否相同物品无论路径如何)

[ ! "$src" -ef "$dst ] && mv -f "$src" "$dst"

$src请注意,当和明显不同但引用相同的文件系统项时,此测试将会失败$dst,因此此测试在许多情况下可能不适用。例如,这将打印“条目“thisname”和“another”相同

src=thisname dst=another
touch "$src"
ln "$src" "$dst"
[ "$src" -ef "$dst" ] && printf "Entries '%s' and '%s' are the same\n" "$src" "$dst"

相关内容