如何更正错误复制到自身的目录?

如何更正错误复制到自身的目录?

鉴于以下情况...

<path>/mydir1/mydir2

...mydir2 所在位置应该有覆盖 mydir1,但被放置在里面,并且两个目录实际上具有相同的文件名。这是怎么固定的?

尝试做mv <path>/mydir/mydir/* <path>/mydir/mv <path>/mydir <path>/ 导致:

mv: cannot move `<path>/mydir/mydir` to a subdirectory of itself, `<path>/mydir`

这看起来很简单,但现在已经很晚了,我无法弄清楚。

有 17 个这样的目录需要修复(每个目录的路径不同,但 mydir 名称相同)。


为了确认,错误消息可能是由以下原因引起的:

# cd /路径/到/目录
# mv mydir/mydir ./
mv:无法将“mydir/mydir”移动到其自身的子目录“./mydir”

还尝试过:

# mv mydir/mydir/* mydir/
mv:无法将“mydir/mydir/otherdir1”移动到其自身的子目录“mydir/otherdir1”
mv:无法将“mydir/mydir/otherdir2”移动到其自身的子目录“mydir/otherdir2”

和...

# mv /path/to/directory/mydir/mydir/otherdir1 /path/to/directory/mydir/
mv:无法将“/path/to/directory/mydir/mydir/otherdir1”移动到其自身的子目录“/path/to/directory/mydir/otherdir1”

并使用临时目录:

# mv mydir/mydir ./mydir-temp
# mv mydir-temp/* mydir/
mv:无法将“mydir-temp/otherdir1”移动到其自身的子目录“mydir/otherdir1”
mv:无法将“mydir-temp/otherdir2”移动到其自身的子目录“mydir/otherdir2”


我发现了一个类似的问题“如何递归地将子文件夹中的所有文件(包括隐藏文件)移动到 *nix 中的父文件夹中?”这表明mv bar/{,.}* .可以做到这一点。

但这也会产生相同的错误,并且令人困惑地从某处拾起.和。..

# cd 目录
# mv mydir/{,.}* .
mv:无法将“mydir/otherdir1”移动到其自身的子目录“./otherdir1”
mv:无法将“mydir/otherdir2”移动到其自身的子目录“./otherdir2”
mv:无法移动“mydir/”。到“./.”:设备或资源繁忙
mv:无法将“mydir/..”移动到“./..”:设备或资源繁忙
mv:覆盖`./.file'? y


另一个类似的问题“linux mv 命令怪异" 表明mv不会覆盖并且需要副本。

# cd 目录
# cp -rf ./mydir/* ./
cp:覆盖`./otherdir1/file1'? y
cp:覆盖`./otherdir1/file2'? y
cp:覆盖`./otherdir1/file3'?

这似乎有效......除了有很多文件(和目录) - 我不想确认每一个!不是f应该阻止这种情况发生吗?

好的,所以cp被别名为cp -i(我用 发现type cp),并通过使用绕过\cp -rf ./mydir/* ./,这似乎有效。

虽然我已经解决了将目录/文件从一个地方转移到另一个地方的问题,但我仍然很好奇这些东西到底发生了什么mv- 这真的是一个故意的功能吗?华纳建议

答案1

首先,将新目录移出(使用临时名称以避免冲突),然后删除原始目录,然后将新目录重命名到位。注意:因为这将涉及批量删除内容,所以在运行这些命令之前请仔细考虑,并确保首先有备份。另外,我在命令之间用 s 编写了这个&&,所以如果一个失败,其余的将不会运行 - 在脚本中很好,但如果您手动执行此操作,最好按顺序键入它们,注意,如果出现问题就停止。

mv <path>/mydir/mydir <path>/mydir-temp &&
rm -R <path>/mydir &&
mv <path>/mydir-temp <path>/mydir

答案2

最好的方法是:

for d in `ls -A`; do if [ "$d" != "TTT" ]; then cp -Rf $d TTT; fi; done

将当前目录中的所有目录递归复制到目录 TTT 中,除了 TTT 本身。选项-Ainls允许您考虑所有隐藏的目录和文件,但不考虑特殊文件。和 .. 以及条件"$d" != "TTT"排除目录 TTT,以避免自身复制。您可以编写bash带有 2 个参数的脚本,保存到本地或系统 bin 并在需要时使用它。

相关内容