【问题标题】:How to copy files based on file type如何根据文件类型复制文件
【发布时间】:2014-10-28 20:01:50
【问题描述】:

我有一个包含子文件夹的文件夹。在这些子文件夹中有 .jpg 和 .mov 文件。

我想要做的是将树复制到另一个根文件夹中,但只包含 .mov 文件。

我可以发出一个终端命令来像魔术一样做到这一点吗?我希望那里可能有一位具有忍者技能的 linux 大师,可以为我节省很多时间。

例子:

当前:

Pictures
-- 2014
----- January
--------- file1.jpg
--------- file1.mov
----- February
--------- file1.jpg
--------- file1.mov
----- March
--------- file1.jpg
--------- file2.jpg
----- April
--------- file1.mov
--------- file2.mov



Desired:
Pictures
-- 2014
----- January
--------- file1.jpg
----- February
--------- file1.jpg
----- March
--------- file1.jpg
--------- file2.jpg



Movies
-- 2014
----- January
--------- file1.mov
----- February
--------- file1.mov
----- April
--------- file1.mov
--------- file2.mov

【问题讨论】:

  • 在 Linux 和 OS X 上的答案会略有不同。
  • 这是您只需要做一次,还是需要重复此操作,将新图片和电影分类到各自的目录中?
  • 只需要做一次。我意识到我的照片集很大,主要是因为视频,所以我的想法是创建一个与树形结构匹配的并行文件夹,并且只包含视频。然后在将来我可以在它们进来时手动对它们进行排序。

标签: linux macos terminal


【解决方案1】:

我会将finddirname 一起使用。在 Linux 和 MacOS 中应该以相同的方式工作。这是一个应该在bash 中工作的shell 脚本。

注意: 为确保您不会在错误的位置运行它或使用错误的 $source$target 值运行它,我在所有基本命令前加上 echo,这样它就会打印命令,而不是执行它。确保它符合您的预期,然后删除所有echo(例如,将echo mkdir ... 替换为mkdir ...)。这是编写复杂的 shell 脚本时的常见预防措施。

source="/path/to/source"
target="/path/to/target"
cd "$source"
find . -type f -name '*.mov' | 
    while read fn ; do 
        path=`dirname $fn` 
        echo mkdir -p "$target/$path"  # -p is essential here
        echo cp "$fn" "$target/$path/"
    done

这里我们遍历$source 目录中的*.mov 文件列表,并为每个文件使用dirname 提取目录名称。然后我们使用mkdir -p$target中创建对应的子目录(会创建所有需要的子目录,如果目录已经存在则不会失败),最后复制文件。

【讨论】:

    【解决方案2】:

    我建议使用rsync,我希望在 OS X 上的语法是一样的

    rsync -vrR --include="*.jpg" --include="*/" --exclude="*" /path/to/source /path/to/target
    

    您需要为 *.mov 和 *.jpg 运行两个单独的命令,因为目标目录不同

    【讨论】:

    • 不错的单行解决方案。虽然我没有尝试过,因为我最终使用了 GUI 工具。 :)
    【解决方案3】:

    如果它对某人有帮助,我实际上找到了一个不需要命令行的更简单的解决方案。我使用 FreeFileSync 将文件复制到新树,然后返回并使用 finder 删除被复制的文件。仍然是一个两步的过程,但它很简单,因为它没有使用命令行。

    FreeFileSync 具有过滤功能,因此我只能隔离要复制的视频。

    从图片文件夹中删除视频就像使用 finder 的搜索功能和仅过滤视频文件类型一样简单。然后一次删除一次将他们全部杀死。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 2018-07-30
      • 2012-12-06
      • 2020-12-21
      • 2018-08-30
      • 1970-01-01
      相关资源
      最近更新 更多