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

发布于 2024-11-28 06:00:45 字数 240 浏览 1 评论 0原文

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

 find | grep 000000

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

I am using Linux and would like to replace all files containing the string 000000 with an existing file /home/user/offblack.png but keep the existing filename. I've been working at this for a while with various combinations of -exec and xargs but no luck. So far I have:

 find | grep 000000

Which does list all the files I want to change fine. How do I copy and replace these files with my existing offblack.png file?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

不美如何 2024-12-05 06:00:45

这是我将使用的内容:

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”(将 /dev/null 添加到文件列表中,以防生成的 fgrep< /code>s 最终只有一个文件名 - 它确保输出始终格式化为“文件名:<行包含'000000'>”),仅删除文件名,然后将 offblack.png 逐一复制到这些文件上。请注意,我在其中插入了 /bin/echo 。这就是你的预演。删除回声以使其真正运行。

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

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

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

Here's what I would use:

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

Expanding, find all the files you're interested in, grep inside of them for the string '000000' (adding /dev/null to the list of files in case one of the generated fgreps ended up with only one filename - it ensures the output is always formatted as "filename: <line containing '000000'>"), strip out only the filenames, then one-by-one, copy in offblack.png over those files. Note that I inserted a /bin/echo in there. That's your dry-run. Remove the echo to get it to run for real.

If what you mean is that the filenames contain "000000":

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

Much simpler. :-) Find every file under the current directory with a name containing your string and exec the copy of offblack.png over it. Again, what I've given you there is a dry-run. Remove the echo for your live fire drill. :-)

可是我不能没有你 2024-12-05 06:00:45
find . -type f | grep 000000 | tr \\n \\0 | xargs -0i+ cp ~/offblack.png "+"
find . -type f | grep 000000 | tr \\n \\0 | xargs -0i+ cp ~/offblack.png "+"
你げ笑在眉眼 2024-12-05 06:00:45

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

需要搜索的手册页更少!

Let's try and use Bash a bit more:

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)

Fewer man pages to search!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文