如何将多个子目录中的选定文件合并到一个目录中

时间:2010-11-29 12:09:21

标签: shell unix file-io

我知道这对unix人来说可能是最基本的,但我还没有在网上找到一个简单的答案。

我有一个包含子目录的目录。其中一些子目录中包含.mov文件。我想将所有的mov合并到一个目录中。我不需要担心文件命名冲突,因为这些文件来自数码相机,它会逐步命名文件,但将它们分成每日文件夹。

什么是Unix-fu用于获取所有这些文件并将其复制(甚至更好,移动它们)到我的主文件夹中的目录?

感谢。

3 个答案:

答案 0 :(得分:1)

这个怎么样?

find "$SOURCE_DIRECTORY" -type f -name '*.mov' -exec mv '{}' "$TARGET_DIRECTORY" ';'

如果源目录和目标目录不重叠,这应该可以正常工作。

编辑:

顺便说一句,如果您有许多相机的情况下的混合大小写扩展(x.mov,y.Mov,Z.MOV),那会更好。它使用-iname,匹配时不区分大小写:

find "$SOURCE_DIRECTORY" -type f -iname '*.mov' -exec mv '{}' "$TARGET_DIRECTORY" ';'

确保将$ SOURCE_DIRECTORY和$ TARGET_DIRECTORY变量替换为实际目录,并且它们不重叠(即目标位于源下的某处)

编辑2:

PS:我刚注意到khachik用他的编辑抓住了这个

答案 1 :(得分:0)

mv `find . -name "*.mov" | xargs` OUTPUTDIR/
在thkala的评论之后

更新

find . -iname "*.mov" | while read line; do mv "$line" OUTPUTDIR/; done

答案 2 :(得分:0)

如果您需要处理奇怪的文件名(空格,特殊字符),请尝试以下方法:

$ cd <source parent directory>
$ find -name '*.mov' -print0 | xargs -0 echo mv -v -t <target directory>

删除上面的“echo”以实际移动,而不是打印会发生的事情。

“mv -v”给出详细输出,“mv -t ...”指定目标目录(可能是GNU特定的)。

“ - print0”和“-0”是处理奇怪文件名的扩展。在非GNU系统上,您可能需要删除这些选项,这将导致换行符分隔的数据。这仍然适用于带空格的文件名,但不适用于带换行符的文件名(是的,它是可能的)。