【问题标题】:Using bash, how do I find all files containing a specific string and replace them with an existing file?使用 bash,如何找到包含特定字符串的所有文件并将它们替换为现有文件?
【发布时间】:2011-08-06 00:58:17
【问题描述】:

我正在使用 Linux,并且想用现有文件 /home/user/offblack.png 替换所有包含字符串 000000 的文件,但保留现有文件名。我一直在使用 -exec 和 xargs 的各种组合来解决这个问题,但没有运气。到目前为止,我有:

 find | grep 000000

它确实列出了我想要更改的所有文件。如何复制这些文件并将其替换为现有的 offblack.png 文件?

【问题讨论】:

    标签: linux bash exec xargs


    【解决方案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
    

    扩展,找到您感兴趣的所有文件,在其中 grep 查找字符串 '000000'(将 /dev/null 添加到文件列表中,以防生成的 fgreps 之一最终只一个文件名 - 它确保输出始终格式化为“文件名:”),只删除文件名,然后一个接一个地复制这些文件的offblack.png。请注意,我在其中插入了/bin/echo。那是你的预演。移除回声以使其真正运行。

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

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

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

    【讨论】:

    • 你的意思是“-exec /bin/cp”而不是“-exec /bin/echo /bin/cp”,对吧?
    • 正如我在回复中对每个命令的描述中所说的那样,这些是它们的“试运行”版本;期望(再次,在我的回答中与每个命令的描述一起提到)是 OP 将首先按原样运行它以查看 会发生什么,然后在舒适时删除回声想要什么。我几乎总是遵循这种具有潜在破坏性的命令的范式。 :-)
    【解决方案2】:
    find . -type f | grep 000000 | tr \\n \\0 | xargs -0i+ cp ~/offblack.png "+"
    

    【讨论】:

    • 这非常有效,现在阅读手册页以准确了解发生了什么。直到现在我还不熟悉 tr 命令。
    【解决方案3】:

    让我们尝试更多地使用 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)
    

    要搜索的手册页更少!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-27
      • 2019-06-07
      • 2023-03-25
      • 2022-12-06
      • 2018-04-10
      • 1970-01-01
      • 2014-10-20
      • 2014-06-07
      相关资源
      最近更新 更多