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

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

$ ls | wc -l 123 $ mkdir new_directory $ mv * ./new_directory 

然而,这显然不会工作,因为那么它会尝试将new_directory移动到new_directory 。 是否有一些简单的方法来做我想要的一行,而不必复制和粘贴该目录中的所有文件和目录?

你的

  mv * ./new_directory 

命令将实际上工作; 它只会打印一个警告,它不能将该目录移动到自身。

一个快速和肮脏的线上。

 mv `ls -A | grep -v new_directory` ./new_directory 

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

 find . -type f -maxdepth 1 -exec mv {} ./new_directory/ \; 

是最便携的解决scheme。 对于速度,你应该移动find和xargs,-print0和-0,但前提是你有GNU find和xargs。

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

 $ mkdir ../new-directory $ mv * ../new-directory/ $ mv ../new-directory . 

要么

 $ mkdir .new-directory $ mv * .new-directory/ $ mv .new-directory new-directory 

第二种forms利用以“。”开头的通配符跳过文件名。

关于什么:

 cd .. mv old_dir new_directory mkdir old_dir mv new_directory old_dir 

IOW,不要把内容移动到一个新的目录中,而是把这个目录放在一个新的目录中。

与@ Rembrane的回答类似(尽pipe不是单行):

 for FN in * do if [ "<new_dir>" != $FN ] then mv $FN <new_dir> done 

这应该是100%便携式 – 即使find是可悲的缺席您的系统。

我的build议:正如别人所说的

 mv * ./new_directory 

将工作findIFF的总扩张足够短。

其他方面,你可以尝试这个扩展到更大数量的文件:

 find . -type f -maxdepth 1 | xargs -s100000 echo | xargs -iXXX mv XXX new_directory 

说明

  1. 列出所有文件。
  2. 将所有文件名分组成最大100000个字符的块。
  3. 每个块构build一个单独的mv命令。

使用:

 find -mindepth 1 -maxdepth 1 \! -name new_directory -print0 | \ xargs -0 -P 100 -I'{}' mv '{}' new_directory 

xargs手册页:

-P max-procs

  Run up to max-procs processes at a time; 

为了避免错误信息并保持简单:

 mv *.* ./new_Folder 

会做同样的事情,但避免错误信息(除非你在我猜的文件夹名称中有点)。