用于列出当前和子文件夹中的所有图像并将其复制到一个文件夹中的shell脚本?

用于列出当前和子文件夹中的所有图像并将其复制到一个文件夹中的shell脚本?,shell,Shell,我有一些文件夹层次结构,在一些文件夹中有图像,我需要一个shell脚本,它可以列出所有图像并将它们复制到一个指定的文件夹中,其中列出它们并不重要,我只想将所有图像复制到一个文件夹中 我知道我可以 ls -R *.png 但如何将它们全部复制到一个文件夹中 谢谢 更新:正如格伦·杰克曼(glenn jackman)所指出的,与我提供的答案相比,这将稍微更有效一些: file . -type f -name \*.png | xargs cp -t destination 有关解释,请参见此答案

我有一些文件夹层次结构,在一些文件夹中有图像,我需要一个shell脚本,它可以列出所有图像并将它们复制到一个指定的文件夹中,其中列出它们并不重要,我只想将所有图像复制到一个文件夹中

我知道我可以

ls -R *.png
但如何将它们全部复制到一个文件夹中


谢谢

更新:正如格伦·杰克曼(glenn jackman)所指出的,与我提供的答案相比,这将稍微更有效一些:

file . -type f -name \*.png | xargs cp -t destination
有关解释,请参见此答案后面的glenn评论


一种方法是使用
查找

find . -type f -name "*.png" -exec cp {} ~/path/to/your/destination/folder \;
说明

  • find
    用于查找文件/目录
  • 从当前工作目录开始查找(或者,您可以指定路径)
  • 代码>类型f < /> >:只考虑文件(与目录相反) < L> >代码>名称“*.pNG”< /> >:仅考虑PNG扩展< /LI>的那些代码
  • -exec
    :对于找到的每个这样的结果,做些什么(见下文)
  • cp{}~/path/to/your/destination/folder\:这是“做点什么”部分:将找到的每个这样的结果(替换到
    {}
    )复制到指定的目标

要一次性复制多个文件模式,我们可以使用-regex代替-name

find . -type f -regex '.*\(jpg\|jpeg\|png\|gif\|mp4\|avi\|svg\|mp3\|vob\)' -exec cp {} /path/to/your/destination/folder \;

使用
文件可以获得轻微的效率-键入f-name\*.png | xargs cp-t destination
@glennjackman-oh-neat!你介意解释一下(或者给我指一些阅读资料)为什么xargs在这里会稍微更有效吗?使用
find-exec cp
,为每个文件名生成cp命令。使用xargs,cp命令由多个文件名组成,因此生成cp的次数更少。节省的时间大约为(一小部分)秒,很可能会被潜在的磁盘i/o完全淹没。@glennjackman这实际上是非常有帮助的学习;谢谢!=)