我目前有一个包含大量.java文件的目录,所有文件都具有不同的名称.即. name.java,name2.java,name3.java
我正在尝试编写一个脚本,该脚本循环遍历目录中的所有文件,并更改其类名(在文件内部)以匹配文件名本身.
当前,所有.java文件都包含类名称MyCritter.我想将每个文件中MyCritter的所有实例更改为特定Java文件本身的名称.我编写了一个脚本来尝试替换所有MyCritter术语,但是输出没有任何变化.在为文件的名字打印回显行之后,代码被冻结:
#!/bin/bash
dir1="/Users/path to folder"
subs=`ls $dir1`
for a in $subs;
do
echo a
[ -f "$a" ]
grep -lr "MyCritter" * | xargs sed “s/MyCritter/$a/g”
done
输出到终端:name.java->然后无限循环/陷入困境
上面的代码一次打印目录中第一个文件的名称,但随后被卡住.当我将第二行更改为此时:[-f“ $a”] ||继续,它贯穿整个代码,但是无法更新文件.
我尝试了grep的其他变体,包括:
grep -lr -e "MyCritter" * | xargs sed -i “s/MyCritter/$a/g”
grep -lr -e "MyCritter" . | xargs sed -i “s/MyCritter/$a/g”
grep -lr -e "MyCritter" . | xargs sed “s/MyCritter/$a/g”
我主要是使用这个网站来指导我的:http://isaacsukin.com/news/2013/06/command-line-tip-replace-word-all-files-directory
向正确方向的任何推动将不胜感激!
解决方法:
如果您不需要脚本形式的解决方案,请在终端中,将cd转到包含* .java文件的目录,然后使用以下命令:
for f in *.java; do sed -i "s/MyCritter/"${f%.*}"/g" "$f"; done
sed命令的“ ${f%.*}”部分返回不带扩展名的文件名,并使用它替换MyCritter.