【发布时间】:2010-11-29 12:09:21
【问题描述】:
我知道这对 unix 人来说可能是基本的,但我还没有在网上找到一个简单的答案。
我有一个带有子目录的目录。其中一些子目录中有 .mov 文件。我想将所有 mov 合并到一个目录中。我不需要担心文件命名冲突,因为这些文件来自数码相机,它会逐步命名文件,但会将它们分成日常文件夹。
什么是 Unix-fu 用于抓取所有这些文件并将它们复制(或者甚至更好,将它们移动)到我的主文件夹中的目录?
谢谢。
【问题讨论】:
我知道这对 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_DIRECTORY 和 $TARGET_DIRECTORY 变量替换为实际目录并且它们不重叠(即目标位于源下方的某个位置)
编辑 2:
PS:我刚刚注意到 khachik 用他的编辑捕捉到了这个
【讨论】:
GNU bash, version 3.2.17(1)-release (i386-apple-darwin9.0) 在 mac 10.5.8 上。命令:find . -type f -name '*.mov' -exec mv '{}' "OU/" ';',错误:mv: rename ./a/1 2.mov to OU/: No such file or directory。
mv `find . -name "*.mov" | xargs` OUTPUTDIR/
更新 thkala 的评论后:
find . -iname "*.mov" | while read line; do mv "$line" OUTPUTDIR/; done
【讨论】:
xargs 读取其标准输入并生成命令行参数列表。如果不带参数调用,它会在一行上打印参数。
如果你需要处理奇怪的文件名(空格、特殊字符),试试这个:
$ 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 系统上,您可能需要删除这些选项,这将产生换行符分隔的数据。这仍然适用于带有空格的文件名,但不适用于带有换行符的文件名(是的,这是可能的)。
【讨论】: