![执行“mv ./* ./subdirdir/”的正确方法是什么?](https://linux22.com/image/68037/%E6%89%A7%E8%A1%8C%E2%80%9Cmv%20.%2F*%20.%2Fsubdirdir%2F%E2%80%9D%E7%9A%84%E6%AD%A3%E7%A1%AE%E6%96%B9%E6%B3%95%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F%20.png)
在当前目录下,我有许多文件和一个目录。我想将所有文件移动到子目录:
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
讲述xargs
0 字节 - 再次,不是 POSIX,但例如被 GNU 理解xargs
-t
指示mv
第一个参数是目标(不是最后一个) - 这对于这个用例来说是理想的 - 像以前一样,选项不在 POSIX 中,但例如由 GNU 实现mv
答案2
您可以尝试另一种更简洁的形式,就像这样:
mv `ls -A |grep -v <subdir>` <subdir>
这里反斜杠字符代表命令替换,即, mv
将使用放置在反斜杠中的命令的输出作为其参数的一部分来执行。