我在Ubuntu平臺上,並且有一個包含許多.py文件和子目錄(也包含.py文件)的目錄。我想在每個.py文件的頂部添加一行文本。使用Perl,Python或shell腳本最簡單的方法是什麼?在當前目錄和子目錄中的每個Python文件的頂部添加一行
回答
#!/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
for a in `find . -name '*.py'` ; do cp "$a" "$a.cp" ; echo "Added line" > "$a" ; cat "$a.cp" >> "$a" ; rm "$a.cp" ; done
import 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)
據我知道你不能在begining或Python文件的末尾插入。只能重寫或追加。
+1在Python中做它 –
這將
- 遞歸走所有的目錄開始與當前工作 目錄
- 只修改那些文件(胡)的文件名以「的.py」
- 結束保存文件的權限(不同於
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 . -name \*.py | xargs sed -i '1a Line of text here'
編輯:從tchrist的評論,處理文件名用空格。
假設你已經GNU發現和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)
您獲得最短,最明顯的方法來接近這個獎。你在目錄或文件名中有空白的潛在錯誤,但是很容易用左側的'-print0'和右側的'-0'修復。 – tchrist
@tchrist:它不會僅僅打印STDOUT的答案,而不是將該行添加到每個文件的頂部? –
@David,不,sed的'-i'選項表示就地更新文件。你不會看到任何標準輸出。 –
什麼使用Perl,Python或shell腳本最簡單的方法?
我會使用Perl,但那是因爲我知道Perl比我知道的Python好得多。哎呀,也許我會在Python中這樣做,只是爲了更好地學習它。
The 最簡單方法是使用您熟悉且可以使用的語言。而且,這也可能是最好的方式。
如果這些都是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
+1使用正確的工具'sed',但你有一個錯誤:當IFS =讀-d'\ 0'-r file'時,你應該說'-print0'到'find'並且管道到'以避免有問題的文件名稱的問題。 – Sorpigal
實際上,名字中的空格或製表符在這裏沒什麼問題(儘管文件名中間是LF)。看看我的程序,最大的問題是我沒有引用變量'$ file'。如果文件名中有空格,我的程序將不起作用。 –
- 1. Python單行打印當前目錄中的每個文件
- 2. 獲取當前目錄中的所有文件和目錄python
- 3. 打印出當前目錄和子目錄中的所有文件在Python
- 4. 查找當前目錄和子目錄包括當前目錄
- 5. 爲目錄和子目錄中的每個文件執行一些操作
- 6. 的Git克隆一個子目錄,在當前目錄
- 7. 對當前目錄中的每個文件執行命令
- 8. 如何搜索當前目錄中的文件和當前目錄下目錄中的文件?
- 9. Solaris Studio在目標文件中添加當前目錄信息
- 10. 從當前目錄和子目錄檢索所有文件
- 11. 如何從Java的當前目錄的父目錄的另一個子目錄中讀取文件?
- 12. Python在每個子目錄中創建和編輯文件
- 13. 從當前目錄的父目錄的另一個子目錄導入另一個模塊(python)
- 14. Powershell - 列出每個子目錄中的子目錄和計數文件
- 15. CoffeeScript - 編譯當前目錄和所有子目錄中的所有.coffee文件
- 16. Makefile編譯當前目錄和所有子目錄中的所有.cpp文件
- 17. 複製一個目錄文件到當前目錄
- 18. 如何在當前目錄和子目錄中對文件使用head命令?
- 19. 列出目錄+子目錄中的所有文件和目錄
- 20. 在node.js中獲取當前目錄上方的一個目錄
- 21. VBScript當前目錄+子目錄?
- 22. 獲取當前目錄並在vbscript中運行一個文件?
- 23. 將_添加到文件夾中的每個文件/目錄
- 24. Python Rar目錄中的所有文件,每個文件不同的目錄
- 25. 對目錄和子目錄中的文件進行Pylint?
- 26. PHP目錄中的子目錄和子目錄函數中的文件總數
- 27. 將vim當前工作目錄設置爲當前項目根目錄或當前文件的目錄
- 28. Docker添加當前目錄中的所有文件
- 29. 無法將文件添加到當前目錄中的git
- 30. PHP腳本動態生成指向目錄,子目錄和當前目錄中的文件的鏈接
我更喜歡'perl -pi -e'BEGIN {print「A new line」}'$(find。-name'* .py')':) – hobbs
@hobbs:I得到的想法,但它似乎並沒有爲我工作(在5.10) –