执行“mv ./* ./subdirdir/”的正确方法是什么?

执行“mv ./* ./subdirdir/”的正确方法是什么?

在当前目录下,我有许多文件和一个目录。我想将所有文件移动到子目录:

mv ./* subdir/
cannot move ./subdir to a subdirectory of itself...

该警告是无害的,但它会使 mv 返回 1,因此无法确定其他文件是否已移动。

cp 可以提供帮助,但我有一些大文件要移动,而且效率不够。

脚本似乎也可以工作,但我更喜欢单行(如果有的话)。

答案1

您可以通过查找来做到这一点:

$ find -maxdepth 1 -not -name subdir -print0 | xargs -0 mv -t subdir

在哪里:

  • -maxdepth 1将查找遍历限制在当前目录中(不是 POSIX 选项,但例如在 GNU 中可用find
  • -print0告诉 find 以 0 字节终止行 - 因此,使该命令可以处理不寻常的文件名(例如包含换行符的文件名),也不是 POSIX,而是由例如 GNU 提供find
  • -0讲述xargs0 字节 - 再次,不是 POSIX,但例如被 GNU 理解xargs
  • -t指示mv第一个参数是目标(不是最后一个) - 这对于这个用例来说是理想的 - 像以前一样,选项不在 POSIX 中,但例如由 GNU 实现mv

答案2

您可以尝试另一种更简洁的形式,就像这样:

mv `ls -A |grep -v <subdir>` <subdir>

这里反斜杠字符代表命令替换,即, mv将使用放置在反斜杠中的命令的输出作为其参数的一部分来执行。

相关内容