我有一个带有嵌套结构的目录“images”,其中有.png文件。 我还有一个普通的目录“svg”,里面有一堆.svg文件。 我需要将每个.svg文件移动到同一个dir中,其中.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”(参见{???} in代码)?
find /svg/ -name "*.svg" -exec basename {} '.svg' \; | xargs -O -I {} "find /images/ -name {}" | grep -v thumb | xargs -i{} dirname {}|xargs -0 -I {} mv /svg/{???} {}
答案 0 :(得分: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