在当前目录和子目录中的每个Python文件顶部添加行

在当前目录和子目录中的每个Python文件顶部添加行,python,linux,perl,shell,Python,Linux,Perl,Shell,我在Ubuntu平台上,有一个包含许多.py文件和子目录(也包含.py文件)的目录。我想在每个.py文件的顶部添加一行文本。使用Perl、Python或shell脚本最简单的方法是什么 for a in `find . -name '*.py'` ; do cp "$a" "$a.cp" ; echo "Added line" > "$a" ; cat "$a.cp" >> "$a" ; rm "$a.cp" ; done 据我所知,在python中不能插入文件的开头或结尾。

我在Ubuntu平台上,有一个包含许多.py文件和子目录(也包含.py文件)的目录。我想在每个.py文件的顶部添加一行文本。使用Perl、Python或shell脚本最简单的方法是什么

for a in `find . -name '*.py'` ; do cp "$a" "$a.cp" ; echo "Added line" > "$a" ; cat "$a.cp" >> "$a" ; rm "$a.cp" ; done
据我所知,在python中不能插入文件的开头或结尾。仅重新写入或追加

    #!/usr/bin/perl

    use Tie::File;
    for (@ARGV) {
        tie my @array, 'Tie::File', $_ or die $!; 
        unshift @array, "A new line";        
    }
要处理目录中的所有
.py
文件,请在shell中递归运行以下命令:

find-名称'*.py'| xargs perl script.pl

这将

  • 从当前工作目录开始递归遍历所有目录 目录
  • 仅修改文件名以“.py”结尾的文件
  • 保留文件权限(不同于
    打开(文件名,'w')
  • 还提供了在修改原始文件之前备份原始文件的选项


    编辑:根据tchrist的注释,用空格处理文件名

    假设您有GNU find和xargs(正如您在问题上指定的linux标记)

    如果没有GNU工具,您将执行以下操作:

    while IFS= read -r filename; do
      { echo "new line"; cat "$filename"; } > tmpfile && mv tmpfile "$filename"
    done < <(find . -name \*.py -print)
    
    而IFS=read-r文件名;做
    {echo“新行”cat“$filename”}>tmpfile&&mv tmpfile“$filename”
    完成<
    使用Perl、Python或shell脚本最简单的方法是什么

    for a in `find . -name '*.py'` ; do cp "$a" "$a.cp" ; echo "Added line" > "$a" ; cat "$a.cp" >> "$a" ; rm "$a.cp" ; done
    
    我会使用Perl,但那是因为我对Perl的了解比Python要好得多。见鬼,也许我会在Python中这样做只是为了更好地学习它

    最简单的方法是使用您熟悉并能使用的语言。而且,这可能也是最好的方法

    如果这些都是Python脚本,我认为您了解Python或者可以接触到一些了解Python的人。因此,您最好使用Python来完成该项目

    但是,也可以使用shell脚本,如果您最了解shell,请随意使用。下面是一个未经测试的shell脚本:

    find . -type f -name "*.py" | while read file
    do
        sed 'i\
    I want to insert this line
    ' $file > $file.temp
      mv $file.temp $file
    done
    

    最后你可能想
    rm$a.cp
    @Didier:你是说
    找到了吗-name*.py
    ?@eugene y:谢谢您的更正。我还引用了find的名字。你以最短、最明显的方式获得该奖项。目录或文件名中确实存在一个可能的空白错误,但如果左边是
    -print0
    ,右边是
    -0
    ,这很容易修复。@tchrist:它不会只是打印STDOUT的答案,而不是在每个文件的顶部添加一行吗?@David,不,sed的
    -i
    选项意味着就地更新文件。你在stdout上看不到任何东西。我有点喜欢
    perl-pi-e'BEGIN{print“A new line”}$(find.-name'*.py')
    :)@hobbs:我明白了这个想法,但它似乎不适合我(在5.10)+1使用正确的工具
    sed
    ,但是你有一个bug:你应该说“代码> -Prtut0 <代码>到<代码>查找< /C>和管道到<代码>,而IFS=读-d′0′-R文件< /> >,以避免问题文件名的问题。实际上,名称中的空格或制表符在这里并不是什么问题(尽管文件名中间有LF)。查看我的程序,最大的问题是我没有引用变量
    $file
    。如果文件名中有空格,我的程序将无法运行。
    find . -name \*.py -print0 | xargs -0 sed -i '1a Line of text here'
    
    while IFS= read -r filename; do
      { echo "new line"; cat "$filename"; } > tmpfile && mv tmpfile "$filename"
    done < <(find . -name \*.py -print)
    
    find . -type f -name "*.py" | while read file
    do
        sed 'i\
    I want to insert this line
    ' $file > $file.temp
      mv $file.temp $file
    done