【发布时间】:2017-11-09 12:45:15
【问题描述】:
我目前有一个目录,其中包含许多不同名称的 .java 文件。 IE。名称.java、名称2.java、名称3.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" ] || continue 时,它会运行整个代码,但无法更新文件。
我尝试过 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
我们将不胜感激任何朝着正确方向的推动!
【问题讨论】:
-
sed 命令周围的引号是非标准的:
”,而不是"。 -
首先,始终通过ShellCheck 运行您的 bash 代码,您对发布的内容有疑问。你为什么用
xargs?