如何将字符串添加到与我的模式匹配的目录中的每个文件?

时间:2010-11-10 13:00:52

标签: linux bash scripting

我正在尝试将require_once 'bootstrap.php';字符串添加到特定目录中的每个schema.yml文件中。我是linux新手。有人可以告诉我one-line-magic-command吗?

非常感谢任何帮助!

修改 我需要递归搜索schema.yml。

5 个答案:

答案 0 :(得分:6)

使用sed:

find somedir -name schema.yml | xargs sed -i "1i require_once 'bootstrap.php';"

答案 1 :(得分:4)

find somedir -name schema.yml | \
   xargs perl -i.orig -pe 'print "require_once \x27bootstrap.yml\x27\n" if $. == 1; close ARGV if eof' 

答案 2 :(得分:2)

您可能需要查看“bootstrap.yml”的拼写...

#!/bin/bash
TMPFILE=/tmp/reallyuniquetempnamewhateveryouchoose
for f in `find . -name schema.yml`
do
    echo "require_once 'bootrstap.yml';" > $TMPFILE
    cat $f >> $TMPFILE
    mv -v $TMPFILE $f
done

编辑:上面的单行内容更好,即使起初有点难以理解:)

答案 3 :(得分:1)

这是@dogbane的答案的后续内容,我喜欢,但需要一些调整才能在我的Mac上正常工作。 (我试图将此作为对他的答案的评论发布,但我认为你不能将所有这些格式都放在评论中。)

我最终得到了:

find somedir -name schema.yml | xargs sed -i '' "1i\\
require_once 'bootstrap.php';
"

具体来说,变化是:

  1. -i的{​​{1}}选项(用于就地编辑的备份文件的扩展名)需要一个参数,但空引号就足够了(告诉它不要创建备份文件) )。
  2. sed命令需要在地址后面加sed(但是转义,因为它是双引号,所以它最终为\),然后是换行符,然后是要添加的文本,然后是另一个换行符,然后是关闭引号。

答案 4 :(得分:0)

创建一个快速python脚本:

prepend_my_text.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import os
from os.path import join

TEXT = """require_once 'bootstrap.php';\n"""

def main():
    for dirpath, _, files in os.walk("."):
        for f in files:
            if f == "schema.yml":
                with file(join(dirpath, f), 'r') as original: data = original.read()
                with file(join(dirpath, f), 'w') as modified: modified.write(TEXT + data)

if __name__ == '__main__':
    main()

并在您正在搜索的目录中运行它: $ chmod +x prepend.py $ ./prepend.py

好处是你可以使用字符串文字(python中的三引号)来避免担心转义字符