我有一堆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_? –