我想要做的是递归查找某些文件并将它们移动到其当前目录的上层。
例如,
foo1/bar1/abc
foo2/bar2/bar3/abc
将更新为
foo1/abc
foo2/bar2/abc
我试过
find -name \*abc -exec /bin/mv '{}' .. \;
但这是错误的,因为它将所有内容都移到了$PWD
.
有没有类似的命令行方式来动态移动东西?还是我必须使用更复杂的脚本?
我想要做的是递归查找某些文件并将它们移动到其当前目录的上层。
例如,
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 将成为无操作。
无论如何,最好测试一下您最终不会在根目录下使用文件,除非这是意图所在。:-)
希望这可以帮助。