1

我有一个具有嵌套结构的目录“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 -v thumb 是因为对于每个 .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/{???} {}
4

1 回答 1

2

这个 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
于 2013-07-25T15:47:59.333 回答