复制包含具有给定扩展名的文件的所有文件夹

复制包含具有给定扩展名的文件的所有文件夹

在 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将查找输出修剪为仅包含目录名称并删除重复项。最后,在创建任何丢失的文件时,循环复制文件夹。sortuniqcp -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 不同的版本findcp因此虽然示例将与 GNU 实用程序一起使用,许多使用 GNU 实用程序的类似问题的示例或答案不要在 OS X 上工作。

相关内容