我正在尝试将所有媒体文件(Mac 文件类型的图像或电影)复制到相同的目录结构,仅获取媒体文件。
- 有没有比我下面提到的更有效的方法?
- Mac OS 中是否存在一种机制来获取图像或电影的类型?
- 不使用中间 tar 文件可以完成此操作吗?(假设有 100,000 个媒体文件)
想法是:
- 创建媒体文件的临时文件列表(tar 无法在命令行中接收那么多文件)
- 创建 tar 文件
- 提取 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
每次接受一个参数