我有一个嵌套结构的目录"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