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

Shell 如何将多个子目录中的选定文件合并到一个目录中,shell,unix,file-io,Shell,Unix,File Io,我知道这对unix用户来说可能是最基本的,但我还没有在网上找到一个简单的答案 我有一个带有子目录的目录。其中一些子目录中有.mov文件。我想将所有MOV合并到一个目录中。我不需要担心文件命名冲突,因为这些文件来自数码相机,它会递增地命名这些文件,但会将它们划分到日常文件夹中 获取所有这些文件并将它们复制(或者更好地说,移动它们)到“我的主文件夹”中的目录的Unix fu是什么 谢谢。这个怎么样 find "$SOURCE_DIRECTORY" -type f -name '*.mov' -exe

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

我有一个带有子目录的目录。其中一些子目录中有.mov文件。我想将所有MOV合并到一个目录中。我不需要担心文件命名冲突,因为这些文件来自数码相机,它会递增地命名这些文件,但会将它们划分到日常文件夹中

获取所有这些文件并将它们复制(或者更好地说,移动它们)到“我的主文件夹”中的目录的Unix fu是什么

谢谢。

这个怎么样

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_目录和$TARGET_目录变量替换为实际目录,并且它们不会重叠(即目标位于源目录下的某个位置)

编辑2:

附言:我刚刚注意到卡奇克用他的剪辑捕捉到了这张照片

mv `find . -name "*.mov" | xargs` OUTPUTDIR/
在特卡拉的评论后更新

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

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

$ cd <source parent directory>
$ find -name '*.mov' -print0 | xargs -0 echo mv -v -t <target directory>
$cd
$find-name'*.mov'-print0 | xargs-0 echo mv-v-t
删除上面的“echo”以实际执行移动,而不是打印将发生的内容

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


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

如果文件名中有空格,这不会中断吗?或者他们太多了?虽然它确实解决了我答案中的目录重叠问题…谢谢!您最后的建议(在读取行时查找-iname“*.mov”;在cp“$line”输出时查找/u DIR/;完成)非常有效。对于我这个非专业的unix用户来说,它也是最容易理解的。我试图理解xargs解决方案,并仔细阅读了xargs,但仍然不理解该命令是如何工作的。@beibel
xargs
读取其标准输入并生成命令行参数列表。如果在没有参数的情况下调用,它会在一行打印参数。@我不知道为什么,但代码不起作用,或者删除或“*.mov”文件…@khachik您确实用实际路径替换了$SOURCE_目录和$TARGETDIRECTORY,对吗?因为它在这里工作得很好…@khachik:你介意告诉我你的操作系统、shell、mv和find版本,以及它失败的确切方式吗?我想弄清这件事的真相…@thkala
gnubash,版本3.2.17(1)-在mac10.5.8上发布(i386-apple-darwin9.0)
。命令:
find-键入f-name'*.mov'-execmv'{}''OU/“;',错误:
mv:rename./a/1 2.mov to OU/:没有这样的文件或目录
。呃。。。我一开始以为是空白,但这在GNU findutils中效果很好(macOS有哪个发现?)。你确定OU/不应该像你之前的评论那样出局吗?我认为没有-0的xargs将在每个空格处分离参数,而不仅仅是换行符。至少我的是这样的。。。