Shell脚本将所有文件从子文件夹移动到父文件夹


47

我的资料夹中有一堆资料夹A。我要将文件从所有这些文件夹移到A

要么

我想剪切子文件夹中的所有文件,然后将其粘贴到父文件夹中。

怎么做?


1
我还没有真正测试这是万无一失或任何东西,但你有没有试过只是在终端进入从文件夹A这个命令: mv */* .
马蒂·弗里德

您确定没有重复的文件名吗?
jippie 2012年

mv */* .不会从子文件夹的子文件夹移动文件。
拉胡尔·维尔帕拉

@jippie是,没有重复的名称
Rahul Virpara 2012年

Answers:


81

转到A目录并运行

find . -mindepth 2 -type f -print -exec mv {} . \;

这意味着“找到该目录及其子目录中的所有文件,并使用target directory。对找到的每个文件执行mv,以将其移动到当前目录。


1
它还尝试移动已经在父目录中的文件。
拉胡尔·维尔帕拉

virpara:现在您的版本忘记了.dot目录中的所有文件。使用-mindepth 2对其进行了修改,以禁止显示警告。
Tuminoid 2012年

1
使用GNU,find您可以变得更优雅一些,并且不会mv为每个文件生成一个进程:find A -mindepth 2 -type f -exec mv -t A \{\} +
David Foerster 2014年

大卫,您的版本可以使用,直到您达到最大命令行长度限制为止,考虑到find如何打印出路径,这并不难做到,特别是在您从A以外的目录调用它的情况下,例如您的示例。
Tuminoid 2014年

9
这是非常危险的。如果在不同的子文件夹中具有相同文件名的文件,则将使用最后一个查找覆盖所有这些文件。最好将mv与--backup = numbered一起使用:find . -mindepth 2 -type f -print -exec mv --backup=numbered {} . \;
pLumo

4

好吧,您可以创建一个文件并将其命名为“ cutme”(要在终端类型中创建一个名为cutme的文件nano cutme。要保存该文件,请按CTRL + X,然后按Enter。),然后在其中假定以下内容,并粘贴以下内容:

  1. 您要递归执行此操作(在这些子文件夹的子文件夹和子文件夹中)
  2. 您想跳过移动脚本文件
  3. 您有权移动该文件夹中的文件
  4. 文件名称中可以包含空格,也可以不包含空格

find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;

注意行内的名称cutme。它应该与您将运行的脚本相同。

创建文件并粘贴上一行之后,在与脚本相同的文件夹中运行以下命令:

chmod +x cutme。这将为您的新文件提供“可执行文件”标志,以便您可以像这样执行它:./cutme


我为什么要尝试移动已经在父目录中的文件?
拉胡尔·维尔帕拉

您可以从文件夹内部运行脚本。其中的每个文件(无论是否在子文件夹中)都将移至该文件夹的父文件夹。此处的父文件夹是与脚本所在位置相关的父文件夹。实际上,通过更改最后2个点,您可以确定运行脚本的文件夹中所有文件的移动位置。
Luis Alvarado 2012年
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.