使用bash,如何查找包含特定字符串的所有文件并将其替换为现有文件?

时间:2011-08-04 20:28:23

标签: linux bash exec xargs

我正在使用Linux,并希望将包含字符串000000的所有文件替换为现有文件/home/user/offblack.png,但保留现有文件名。我已经使用-exec和xargs的各种组合工作了一段时间,但没有运气。到目前为止,我有:

 find | grep 000000

列出了我想要改变的所有文件。如何使用现有的offblack.png文件复制和替换这些文件?

3 个答案:

答案 0 :(得分:1)

以下是我要使用的内容:

find (your find args here) \
| xargs fgrep '000000' /dev/null \
| awk -F: '{print $1}' \
| xargs -n 1 -I ORIGINAL_FILENAME /bin/echo /bin/cp /path/to/offblack.png ORIGINAL_FILENAME

展开,找到你感兴趣的所有文件,在其中找到字符串'000000'的grep(如果生成的fgrep之一最终被添加到文件列表中的/ dev / null只有一个文件名 - 它确保输出始终格式化为“filename:< line包含'000000'>”),只删除文件名,然后逐个删除offblack.png中的那些文件。请注意,我在那里插入了/bin/echo。那是你的干涸。删除回声以使其真实运行。

如果你的意思是文件名包含“000000”:

find . -type f -a -name '*000000*' -exec /bin/echo /bin/cp /path/to/offblack.png {} \;

更简单。 :-)使用包含字符串的名称查找当前目录下的每个文件,并在其上执行offblack.png的副本。再一次,我给你的是干涸的。移除现场消防演习的回声。 : - )

答案 1 :(得分:0)

find . -type f | grep 000000 | tr \\n \\0 | xargs -0i+ cp ~/offblack.png "+"

答案 2 :(得分:0)

让我们尝试更多地使用Bash:

for read -r filename
do
    hit=""
    for read -r
    do
        if [[ $REPLY == *000000* ]]
        then
            hit=$filename
            break
        fi
    done < $filename

    [[ -n $hit ]] && cp /path/offblack.png $filename

done < <(find . -type -f)

搜索的手册页数更少!