对于所有不包含字符串的文件,在文件前面添加一个字符串

对于所有不包含字符串的文件,在文件前面添加一个字符串

我正在尝试遍历 html 文件列表,检查{% load static from staticfiles %}文件中是否存在并如果它不存在,添加{% load static from staticfiles %}到它前面。

这是我现在在 1 个文件中调用的内容job/home.html(用于在将其应用于所有文件之前进行测试):

grep -q '{% load static from staticfiles %}' job/home.html || sed -i '' 's+{% load static from staticfiles %}\n+' job/home.html

所以有两件事,

  • 如何使此命令对所有 html 文件递归
  • 断行,\n好像不是断行

答案1

尝试以下操作,它应该返回递归结果

find /home/user/myfolder -name '*.html' -exec sh -c '
  for file do
    yourcommands with "$file"
  done' sh {} +

有关 find 的更多信息以及大量示例http://en.wikipedia.org/wiki/查找还有一些不同的东西https://unix.stackexchange.com/questions/tagged/find

答案2

尝试这样做:

find /home/user/myfolder -name '*.html' -exec sh -c '
    fgrep &>/dev/null "{% load static from staticfiles %}" "$1" ||
        sed -i '1i {% load static from staticfiles %}!' "$1"
' -- {} \;

答案3

如果你有bash4 或更新版本您可以使用shopt -s globstar来启用递归 glob(除其他外):

... job/**/*.html

(感谢@evilsoup!)

这个 glob 将解析为.html内部任何位置的所有文件job/(不要被第二个斜杠误导;看起来 glob 实际上是**/)。

将文本添加到文件的开头半安全:

echo "text" | cat - yourfile > /tmp/out && mv /tmp/out yourfile

一种更安全的解决方案是使用随机临时目录,以避免几乎任何其他进程干扰此目录:

dir="$(mktemp -d)" && echo "text" | cat - yourfile > "$dir/out" && mv "$dir/out" yourfile

相关内容