在 Mac 终端中,我想查找至少包含一个具有指定扩展名的文件的所有目录,并将它们复制到其他位置。我发现find . -iname '*.jpg' -exec dirname {} \;
它似乎可以找到包含*.jpg
文件的所有目录,但我不确定如何复制它们。我尝试将其与rsync
但无法使其工作。最好的方法是什么?
答案1
这是一个bash
友好的单行代码,它将任何包含 jpg 的文件夹复制到名为 backup 的文件夹中,同时保持目录结构
mkdir backup; for folder in $(find . -type f -name '*.jpg' | sed -r 's|/[^/]+$||' |sort |uniq); do cp -r --parents $folder backup; done
首先它创建一个空backup
文件夹,然后该find
命令查找当前目录中以.jpg
. 、和命令sed
将查找输出修剪为仅包含目录名称并删除重复项。最后,在创建任何丢失的文件时,循环复制文件夹。sort
uniq
cp -r --parents
你可以通过像这样sed -r
使用-printf
标志来绕过使用find
mkdir backup; for folder in $(find . -type f -name '*.jpg' -printf "%h\n" |sort |uniq); do cp -r --parents $folder backup; done
如果你find
不支持-printf
你可以尝试使用grep
mkdir backup; for folder in $(find . -type f -name '*.jpg' | grep -o "\(.*\)/" |sort |uniq); do cp -r --parents $folder backup; done
答案2
要查找所有具有扩展名的文件.py
,这应该适用于 OS X shell:
find . *.py -print0 | xargs -0 -I{} cp -r {} /some/dir/name/
笔记:
find -print0
打印以空字符而不是换行符结尾的文件,并xargs -0
用于该格式的输入。这是为了更好地处理包含空格或其他空白的文件名和路径,否则这通常会令人头痛。- OS X 使用与 Linux/GNU 不同的版本
find
,cp
因此虽然这示例将与 GNU 实用程序一起使用,许多使用 GNU 实用程序的类似问题的示例或答案不要在 OS X 上工作。