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

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

将更新为
foo1/abc
foo2/bar2/abc

我试过了
find -name \*abc -exec /bin/mv '{}' .. \;

但这是错误的,因为它将所有内容移动到了$PWD的上层目录。
有没有类似的命令行方式来动态地向上移动东西?还是必须使用更复杂的脚本?

最佳答案

干得好。。
这就是结构看起来像是从…

$ 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将文件带到父目录。
重要警告:
如果您希望将文件放在搜索的根目录中,则
最终文件将移动到搜索的父目录
从而将它们永远从您的匹配模式中移除。
或者
如果您在文件系统的根目录下,文件将始终匹配
而MV将成为一个不可操作的。
不管怎样,最好测试一下,不要在根目录下使用文件,除非这就是目的所在。-)
希望这有帮助。

关于linux - Linux命令行,如何将找到的所有文件移动到上层目录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11552412/

10-11 23:09
查看更多