我有一堆javascript文件,我需要在包含文件名的每個文件開頭的新行上添加註釋,例如如何在終端中遞歸地添加一行包含文件名的文本到所有文本文件?
/* app.js */
我想從我的Mac上從終端上的文件夾遞歸做到這一點。
任何人都可以幫忙嗎?
謝謝!
我有一堆javascript文件,我需要在包含文件名的每個文件開頭的新行上添加註釋,例如如何在終端中遞歸地添加一行包含文件名的文本到所有文本文件?
/* app.js */
我想從我的Mac上從終端上的文件夾遞歸做到這一點。
任何人都可以幫忙嗎?
謝謝!
您可以使用SED此,嘗試是這樣的:
#!/bin/bash
for i in $(find ./ -name *.js);
do
`sed -i 's/$i \*\//$i \*\/\n&/' "$i"`
done
插入帶有SED新行可能是一個問題,因爲不是所有版本的工作原理相同。要獲得概述,請參閱此reference。例如,您可以用G
或{G;}
替換替換部分。這取決於你的sed版本。 類似的問題已經回答here和here
另一個有趣的解決方案:
如果要追加一個新行的第一行後,你也可以使用這個:
sed -i "1a\ " test.js
因此改變以上腳本代碼如下:
#!/bin/bash
for i in $(find ./ -name *.js);
do
`sed -i "1a\ " $1`
done
首先,我們必須找到這些文件:
$ find $folder_name -type f -name "*.js" -print
這將找到的所有文件與*.js
後綴。 type -f
意味着只查找文件(只要您有一個目錄名稱以.js
結尾)。我將假定您的JavaScript文件名不包含空格,或者控制名稱中的字符如<NL>
。否則,我們將不得不做更多的工作。
我們可以使用該find語句來查找所有這些文件,然後我們可以找到這些文件。一旦我們找到這些文件,我們必須弄清楚如何使文件陷入最後的評論行。
我們將採取三步走的辦法:
第一步,我們將使用echo創建一個帶有舊名稱的新文件。然後,我們將使用cat命令連接新文件上的舊文件。最後,我們將使用mv至重命名爲新構建的文件爲舊名稱。
find $javascript_dir -type f -name "*.js" -print | while read file_name
do
basename=$(basename $file_name)
echo "/* $basename */" > "$basename.tmp"
cat "$file_name" >> "$basename.tmp"
mv "$basename.tmp" "$file_name"
done
注意>
重定向命令指定的文件的輸出,並追加>>
命令指定的文件輸出。 mv
代表移動。在Unix中,文件實際上是通過inode標識來存儲的。有一個內容表將inode與文件的全名(包括目錄)相匹配。因此,在Unix中移動文件與重命名文件相同,所以目錄名稱被改變。在Windows批處理中,有單獨的move
和rename
命令。在Unix中,它們都是mv
。
我們可以使用sed
在該行的地方預謀做的:
find . -name "*.js" -print | while read file_name
do
basename=$(basename $file_name)
sed -i "" "1i\\
/* $basename */
" "$file_name"
done
sed
是一個功能強大的在線編輯器,大多數人只使用其替代命令模式。然而,sed
腳本可能會更復雜和豐富(並且模糊,這就是您很少看到它們的原因)。
您可以使用cat -
和臨時文件:「」
# adds filename to top of each file in $DIR
DIR=. # set to whatever directory
FILES=$(find $DIR -type f)
for FILE in $FILES; do
FILE=$(echo $FILE | sed -e s/\.\\\///) # remove leading "./" if DIR is "."
echo "/* $FILE */" | cat - $FILE > tempfile.tmp # add the line using a temp file
mv tempfile.tmp $FILE # move the temp file back to the original file
done
注意,如果DIR沒有這將增加相對於DIR文件的完整路徑。要只添加文件名本身,您可以使用:
echo "/* $(basename $FILE) */" | cat - $FILE > tempfile.tmp # add the line using a temp file
如果你打算使用'find'命令,爲什麼要找到這些文件,然後使用'for'循環來遍歷它們?只需在'find'命令的末尾輸入'while read'循環。我喜歡將'cat'輸送到'echo'命令的末尾。 –
當然,你可以將'find'輸出連接到'while read'。爲了清晰和可讀性,我只是添加了中間FILES變量。文件可以是由'ls','find'或任何其他函數或腳本生成的文件的任何列表。 –
謝謝。我似乎無法得到這從殼腳本內運行。難道我做錯了什麼?或者是否有我可以從命令行運行的命令? – alidrongo
「類似」意味着「修復所有錯誤」。 – chepner
你測試了這個腳本嗎?你的循環將增加'find','。','-name',然後是當前目錄中所有以'* .js'結尾的文件。你也有大寫字母「For」,「Do」,「Sed」和「Done」。最後,如果你真的想要插入一行,爲什麼在'sed'腳本中使用_substitution_? –