我在一个Ubuntu平台上,有一个包含许多.py文件和子目录(也包含.py文件)的目录。我想在每个.py文件的顶部添加一行文字。使用Perl、Python或shell脚本,最简单的方法是什么?
find . -name \*.py | xargs sed -i '1a Line of text here'
编辑:根据tchrist的评论,处理带有空格的文件名。
假设您已经拥有GNU find和xargs(由于您在问题中指定了linux标签)。
find . -name \*.py -print0 | xargs -0 sed -i '1a Line of text here'
没有GNU工具,你会做如下操作:
while IFS= read -r filename; do
{ echo "new line"; cat "$filename"; } > tmpfile && mv tmpfile "$filename"
done < <(find . -name \*.py -print)
for a in `find . -name '*.py'` ; do cp "$a" "$a.cp" ; echo "Added line" > "$a" ; cat "$a.cp" >> "$a" ; rm "$a.cp" ; done
find . -name *.py
呢? - Eugene Yarmashimport os
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith('.py')
file_ptr = open(file, 'r')
old_content = file_ptr.read()
file_ptr = open(file, 'w')
file_ptr.write(your_new_line)
file_ptr.write(old_content)
#!/usr/bin/perl
use Tie::File;
for (@ARGV) {
tie my @array, 'Tie::File', $_ or die $!;
unshift @array, "A new line";
}
要递归处理目录中的所有.py
文件,请在您的shell中运行以下命令:
find . -name '*.py' | xargs perl script.pl
perl -pi -e 'BEGIN { print "A new line" }' $(find . -name '*.py')
:) - hobbs这将
open(filename,'w')
不同)fileinput还提供了在修改文件之前备份原始文件的选项。
import fileinput
import os
import sys
for root, dirs, files in os.walk('.'):
for line in fileinput.input(
(os.path.join(root,name) for name in files if name.endswith('.py')),
inplace=True,
# backup='.bak' # uncomment this if you want backups
):
if fileinput.isfirstline():
sys.stdout.write('Add line\n{l}'.format(l=line))
else:
sys.stdout.write(line)
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
sed
是正确的,但你有一个bug:你应该使用-print0
来告诉find
命令,并通过管道传递给while IFS= read -d '\0' -r file
,以避免出现文件名问题。 - sorpigal$file
。如果文件名中有空格,我的程序将无法正常工作。 - David W.
-i
йЂ‰йҰ№ж„Џе‘ізқЂеҺџењ°ж›ө新文件。дҢ ењЁstdoutдёЉзњ‹дёҚе€°д»»дҢ•дёњиӨүгЂ‚ - glenn jackman