如何收集 Mac 目录结构中的所有媒体文件?

如何收集 Mac 目录结构中的所有媒体文件?

我正在尝试将所有媒体文件(Mac 文件类型的图像或电影)复制到相同的目录结构,仅获取媒体文件。

  1. 有没有比我下面提到的更有效的方法?
  2. Mac OS 中是否存在一种机制来获取图像或电影的类型?
  3. 不使用中间 tar 文件可以完成此操作吗?(假设有 100,000 个媒体文件)

想法是:

  1. 创建媒体文件的临时文件列表(tar 无法在命令行中接收那么多文件)
  2. 创建 tar 文件
  3. 提取 tar 文件

谢谢您的任何建议。

# $1 is the directory to search for media
# $2 is the output file name
media_list() {
  find $1 -type f \( -iname "*.JPG" -o -iname "*.JPEG" -o -iname "*.NREF" -o -iname "*.TIFF" -o -iname "*.wmv" -o -iname "*.MOV" -o -iname "*.mp4" -o -iname "*.MPG" -o -iname "*.AVI" -o -iname "*.3g2" -o -iname "*.3gp" -o -iname "*.m4v" \) > $2
}

# $1 is the directory to get media
# $2 is the output tar file name
tar_media() {
  rm file-list.txt
  media_list $1 file-list.txt
  tar -cv -f $2 -I file-list.txt 
}

答案1

不同的选择:

mdfind -onlyin . 'kMDItemContentTypeTree=public.movie||kMDItemContentTypeTree=public.image' | parallel cp {} /tmp/{/}

  • 可并联安装brew install parallel
  • {/}是基本名称

find . -iname \*.mkv -o -iname \*.jpg | while IFS= read -r f; do cp "$f" /tmp/"${f%%*/}"; done

  • 读取 IFS 中从行首到行末的带状字符
  • read -r禁用反斜杠解释
  • ${f%%*/}*/从开头删除最长的模式

shopt -s globstar extglob nocaseglob; for f in **/*.@(mkv|jpg); do cp "$f" "/tmp/${f%%*/}"; done

  • globstar(在 bash 4.0 中添加)**匹配多级目录
  • extglob添加对@(pat1|pat2)(恰好一个)的支持
  • nocaseglob使 glob 不区分大小写

f() { cp "$1" "/tmp/${1%%*/}"; }; export -f f; gfind . -regextype posix-extended -iregex '.*\.(mkv|jpg)' -print0 | xargs -0 -n1 bash -c 'f "$1"' _

  • OS X 的 find 不支持扩展正则表达式,因此该命令使用 GNU find
  • export -f并且bash -c需要使用 xargs 运行该函数
  • xargs -n1每次接受一个参数

相关内容