find + xargs:对于其他嵌套目录中的dir find对中的所有文件并移动到那里

时间:2013-07-25 15:23:56

标签: bash find pipe xargs mv

我有一个带有嵌套结构的目录“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/{???} {}

1 个答案:

答案 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