【问题标题】:How to consolidate selected files from multiple sub-directories into one directory如何将多个子目录中的选定文件合并到一个目录中
【发布时间】:2010-11-29 12:09:21
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

    标签: shell unix file-io


    【解决方案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 用他的编辑捕捉到了这个

    【讨论】:

    • @thkala 我不知道为什么,但是代码不起作用,或者删除或“*.mov”文件...
    • @khachik 您确实将 $SOURCE_DIRECTORY 和 $TARGETDIRECTORY 替换为您的实际路径,对吧?因为它在这里工作得很好......
    • @khachik:您介意告诉我您的操作系统、shell、mv 和查找版本,以及失败的确切方式吗?我想深入了解这个......
    • @thkala 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
    • 呃...我一开始以为是空格,但这在 GNU findutils (macOS 有哪个 find ?)中可以正常工作。您确定 OU/ 不应像您之前的评论中那样 OUT/ 吗?
    【解决方案2】:
    mv `find . -name "*.mov" | xargs` OUTPUTDIR/
    

    更新 thkala 的评论后:

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

    【讨论】:

    • 如果文件名中有空格,这不会中断吗?或者如果他们太多了?虽然它确实解决了我的答案的目录重叠问题...
    • 谢谢!您的最终建议(find . -iname "*.mov" | while read line; do cp "$line" OUTPUT_DIR/; done)效果很好。对于非专业的 unix 用户来说,这也是最容易理解的。我试图了解 xargs 解决方案,并阅读了 xargs,但仍然不明白该命令是如何工作的。
    • @beibel xargs 读取其标准输入并生成命令行参数列表。如果不带参数调用,它会在一行上打印参数。
    【解决方案3】:

    如果你需要处理奇怪的文件名(空格、特殊字符),试试这个:

    $ 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 系统上,您可能需要删除这些选项,这将产生换行符分隔的数据。这仍然适用于带有空格的文件名,但不适用于带有换行符的文件名(是的,这是可能的)。

    【讨论】:

    • 我认为没有 -0 的 xargs 将在每个空格处分隔参数,而不仅仅是换行符。至少我是这样的……
    猜你喜欢
    • 2011-06-02
    • 2017-08-14
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 2020-06-02
    相关资源
    最近更新 更多