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


14

我的目录中有很多文件和目录。为了整理它,我将所有这些文件放入目录中,因此我将执行以下操作:

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

但是,那显然是行不通的,因为那样的话它将尝试new_directory进入new_directory。有什么简单的方法可以在一行中完成我想要的操作,而不必复制并粘贴该目录中的所有文件和目录?


3
它可以正常工作,只是显示一条错误消息,提示它无法将new_directory移入自身。
cas

Answers:


18

您的

mv * ./new_directory
命令实际上会起作用;它只会显示一条警告,提示它无法将该目录移入自身。


“唯一”的问题是,如果命令的总扩展变得太长(即文件太多,名称太长),它将不再起作用。
Niels Basjes,09年

附带说明一下,如果要使用a执行此操作,则git mv必须使用该-k标志,因为git默认会失败,而不仅仅是发出警告。所以你需要做git mv -k * ./new_dir
Yuval 2012年

11

快速又脏的oneliner。

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

1
将不起作用:纯ls不会显示点文件。
wzzrd

很好的一点。使用-a修复了该问题。

2
因此,现在不尝试将new_directory本身设置为mv(原始问题),而是尝试移动。和..进入new_directory。
Niels Basjes,09年

2
感谢您的反馈Niels。用鞋帮a固定它去除了。和目录列表中的..

8

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

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

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


3
使用最近的GNU查找,您也可以使用\ +代替\;。减少我们制作的MV的数量。
wzzrd

如果您找到了GNU,也可以使用xargs,它会做同样的事情,并允许您使用-p标志同时运行多个mv。
ian

很酷的用法find-可悲的是,尽管我肯定使用过没有的系统:(
沃伦

真?find是(afaik)在SUS中指定的,因此所有内容都应具有它。唯一的问题是它是GNU查找(有很多不错的选择)还是常规查找。
慈安


6

在遇到这个问题的时候,我已经执行了以下一项操作:

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

要么

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

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


我忘记了通配符跳过的点缀文件;感谢您的提醒 !:)
庆典

2

关于什么:

cd ..
mv old_dir new_directory
mkdir old_dir
mv new_directory old_dir

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


1

以与@ Rembrane的答案类似的方式(尽管不是单一的):

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

这应该是100%可移植的-即使find遗憾的是系统中也没有。


在单个unix规范中需要find。因此,它永远都不会消失(不是您不能用它来构建某些东西。但是我想这需要付出巨大的努力,而且没有任何供应商系统会缺少它)
Cian

也许是一些超级偏执的sysadmin正在使用findutils或其等效方法?不确定,但是我知道我遇到了没有它的拳击手:(
沃伦

1

我的建议:正如其他人所说,

mv * ./new_directory

可以找到IFF的总扩展量足够短。

否则,您可以尝试将其缩放到更大数量的文件:

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

说明

  1. 列出所有文件。
  2. 将所有文件名分组为最多100000个字符的块。
  3. 每个块构造一个mv命令。

如果文件名中有空格,则中断
Cian

你是对的。所以我想应该用-print0和-0标志来增强它来解决。
Niels Basjes,09年

我试着-print0-0它仍然中断。
Cristian Ciupitu 09年

发现:警告:您已经在非选项参数-type之后指定了-maxdepth选项,但是选项不是位置性的(-maxdepth影响在其之前和之后指定的测试)。请在其他参数之前指定选项。
Cristian Ciupitu 09年

1

采用:

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

xargs手册页:

-P最大进程

  Run up to max-procs processes at a time;

-1

为了避免错误消息并使之保持简单:

mv *.* ./new_Folder

将做同样的事情,但避免出现错误消息(除非我猜文件夹名称中没有圆点)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.