Bash 片段将目录中的所有文件移动到该目录中

Ama*_*rus 15 linux unix bash

我有一个目录,里面有很多文件和目录。为了整理一下,我将把所有这些文件放到一个目录中,所以我打算做这样的事情:

$ ls | wc -l
123
$ mkdir new_directory
$ mv * ./new_directory
Run Code Online (Sandbox Code Playgroud)

但是,这显然行不通,因为它会尝试new_directory进入new_directory. 是否有一些简单的方法可以在一行中完成我想要的操作,而不必复制和粘贴该目录中的所有文件和目录?

mib*_*bus 19

您的

mv * ./new_directory
命令实际上会起作用;它只会打印一条警告,指出它无法将该目录移动到自身中。


小智 11

一个快速而肮脏的单线。

mv `ls -A | grep -v new_directory` ./new_directory
Run Code Online (Sandbox Code Playgroud)

  • 因此,您现在尝试将 . 和..进入new_directory。 (2认同)
  • 感谢尼尔斯的反馈。用上面的 a 固定它,删除 . 和 .. 来自目录列表。 (2认同)

Cia*_*ian 8

如果您只是在寻找文件(即不是目录),那么

find . -type f -maxdepth 1 -exec mv {} ./new_directory/ \;
Run Code Online (Sandbox Code Playgroud)

是最便携的解决方案。为了速度,您应该使用 -print0 和 -0 移动 find 和 xargs,但前提是您有 GNU find 和 xargs。

  • 使用最近的 GNU 查找,您还可以使用 \+ 而不是 \; 减少我们正在制作的 mv 的数量。 (3认同)

Ken*_*ter 6

我遇到这个问题的时候,我做了以下事情之一:

$ mkdir ../new-directory
$ mv * ../new-directory/
$ mv ../new-directory .
Run Code Online (Sandbox Code Playgroud)

或者

$ mkdir .new-directory
$ mv * .new-directory/
$ mv .new-directory new-directory
Run Code Online (Sandbox Code Playgroud)

第二种形式利用通配符跳过以 '.' 开头的文件名。