![](/img/trans.png)
[英]How to replace a string in a file only if the line containing it does not also contain a specific string using Bash?
[英]Using bash, how do I find all files containing a specific string and replace them with an existing file?
我正在使用Linux,并希望将包含字符串000000的所有文件替换为现有文件/home/user/offblack.png,但保留现有文件名。 我已经使用-exec和xargs的各种组合进行了一段时间,但是没有运气。 到目前为止,我有:
find | grep 000000
哪个列出了我想更改的所有文件。 如何将这些文件复制并替换为现有的offblack.png文件?
这是我会用的:
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添加到文件列表中,以防所生成的fgrep
之一仅以一个文件名结尾-这可以确保输出始终格式化为“文件名:<包含'000000'>的行”),仅删除文件名,然后一个接一个地复制到这些文件的offblack.png中。 请注意,我在其中插入了/bin/echo
。 那是你的空想。 删除回声,使其真正运行。
如果您的意思是文件名包含“ 000000”:
find . -type f -a -name '*000000*' -exec /bin/echo /bin/cp /path/to/offblack.png {} \;
简单得多。 :-)在当前目录下找到每个文件,每个文件的名称都包含您的字符串,并在其上执行offblack.png的副本。 再次,我给你的是空转。 删除现场消防演习的回声。 :-)
find . -type f | grep 000000 | tr \\n \\0 | xargs -0i+ cp ~/offblack.png "+"
让我们尝试更多地使用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)
搜索的手册页更少!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.