find+xargs:对于一个目录中的所有文件,在另一个嵌套的目录中找到对并移动到那里



我有一个嵌套结构的目录"images",其中有.png文件。我还有一个普通的目录"svg",里面有一堆.svg文件。我需要将每个.svg文件移到相同的目录中,其中有相同名称的.png文件。

对于单个给定的.svg文件,此命令有效:

find /images -name 'sample.png' | grep -v thumb | xargs -i{} dirname {}|xargs -0 -I {}  mv /svg/sample.svg {}

应用grep-vthumb是因为对于每个.png文件,在其他名为"thumb"的子目录中都有一个同名的缩略图文件。

我试着为所有文件编写这个命令:

find /svg/ -name "*.svg" -exec basename {} '.svg' ; | xargs -O -I {} "find /images/ -name {}"

但我收到错误:"basename"被信号13 终止

此外,如果第二个命令有效,下一步是将其与第一个命令结合起来,但还有另一个问题:如何将给定的文件名发送到最终命令"mv"(请参阅代码中的{???})?

find /svg/ -name "*.svg" -exec basename {} '.svg' ; | xargs -O -I {} "find /images/ -name {}" | grep -v thumb | xargs -i{} dirname {}|xargs -0 -I {}  mv /svg/{???} {}

这个bash脚本应该可以工作。有时解决方案无法轻易地插入管道:

#! /bin/bash
for svg in svg/*.svg ; do
    name=${svg##*/}                                  # Remove the path.
    name=${name%.svg}                                # Remove the extension.
    png=$(find -name $name.png -not -path '*thumb*')
    dir=${png%$name.png}                             # Remove the filename.
    mv "$svg" "$dir"
done

最新更新