我正在尝试使用以下命令:
find . -type d -name "2016*" -exec mv {}/* ../../../Pictures/2016/ \;
将以 2016 开头的任何文件夹中的所有文件移动到名为 Pictures/2016 的另一个文件夹中。它没有找到文件/目录,但是回显给出了以下内容:
mv ./2016-02-13/* ../../../Pictures/2016/
Stack Exchange 的聪明人有什么想法吗?
答案1
使用子 shellfind
*
在 shell 看到它之前,它将被展开find
,所以这是错误的——它甚至可能导致数据丢失。您不能引用它,因为这样它根本就不会被展开。
你所需要的是一个接收文件夹作为参数的子 shell,然后稍后进行扩展:
find . -type d -name '2016*' -exec sh -c 'mv -- "$0"/* /path/to/target/' {} \;
可防止--
以 开头的文件-
被解释为mv
选项,并且您应该在 中引用文件夹名称"$0"
。
使用纯 Bash
使用 Bash ≥ 4.0 的递归通配符的替代方法:
shopt -s globstar
mv **/2016*/* /path/to/target/
我想这会干净得多,尽管它会因文件数量过多而崩溃。