Linux命令行,如何将所有找到的文件移动到上层目录

时间:2012-07-19 00:37:42

标签: linux shell command-line

我想要做的是递归地找到某些文件并将它们移动到当前目录的上层。

例如,

foo1/bar1/abc
foo2/bar2/bar3/abc

将更新为

foo1/abc
foo2/bar2/abc

我试过

find -name \*abc -exec /bin/mv '{}' .. \;

但这是错误的,因为它将所有内容移动到$PWD的上层目录。

是否有类似的cmd线方式动态移动东西?或者我是否必须使用更复杂的脚本?

1 个答案:

答案 0 :(得分:2)

你去..

这就是结构的开始......

$ tree

[.]
 +-- foo1
 !   `-- bar1
 !       `-- abc
 !
 `-- foo2
     `-- bar2
         `-- bar3
             `-- abc

然后我们运行命令来移动文件

$ find . -type f -name "*abc" -exec bash -c ' mv -v  {} `dirname {}`/.. '  \;

这会产生这个输出......

`./foo1/bar1/abc' -> `./foo1/bar1/../abc'
`./foo2/bar2/bar3/abc' -> `./foo2/bar2/bar3/../abc'

现在目录结构看起来像..

$ tree

[.]
 +-- foo1
 !   +-- abc
 !   `-- bar1
 !
 `-- foo2
     `-- bar2
         +-- abc
         `-- bar3

重要的一点......

-type f        <-- Make sure that you pick files not folders, if you need folders too omit this.
-name "*abc"   <-- Your file-match pattern
-exec bash -c ' mv -v  {} `dirname {}`/.. '  \;

这里.. 执行bash,传递一个字符串,找到文件的目录,并在末尾添加一个'/ ..',使mv将文件带到父目录。

重要警告:

  

如果您希望将文件放在搜索的根目录中   最终文件将移动到您搜索的父目录   root因此永远将它们从你的比赛模式中取出。

OR

  

如果您位于文件系统的根目录,则始终匹配的文件   而mv将成为无操作。

无论如何,测试你不会在根目录结束文件会很好,除非这是意图。 : - )

希望这有帮助。