我有这个脚本,它打印出第一行为空的文件:
for f in `find . -regex ".*.php"`; do
for t in head; do
$t -1 $f |egrep '^[ ]*$' >/dev/null && echo "blank line at the $t of $f";
done;
done
我如何改进这一点,以实际删除空行,或者至少复制所有的文件与空白的第一行到其他地方。
我尝试使用this进行复制,这很好,因为它复制保留了目录结构,但它复制的是每个php文件,我需要捕获egrep的正输出并只复制这些文件。
rsync -R $f ../DavidSiteBlankFirst/
我个人会使用sed
find ./ -type f -regex '.*.php' -exec sed -i -e '1{/^[[:blank:]]*$/d;}' '{}' ;
查找所有以.php结尾的常规文件,并执行sed命令,该命令只在第一行工作,检查其是否为空,如果为空则将其删除,文件中的其他空行不受影响。
仅使用find
和sed
:
find . -type f -name "*.php" -exec sed -i '1{/^s*$/d;q;}' {} ;
-type f
选项只能找到文件,而不是我希望你会用.php
后缀命名文件夹,但这是一个很好的做法。使用-regex '.*.php'
是多余的,使用全局化的-name "*.php"
会更混乱。使用find的-exec
而不是shell脚本,sed
脚本将对find
传递的每个匹配文件进行操作。
sed
脚本只查看第一行1
,并将{}
中的操作应用于该行。我们检查行是否为空/^s*$/
,如果行匹配,我们删除d
它并退出q
脚本,这样就不会读取文件中的所有其他行。-i
选项将更改保存回文件,因为sed
的默认行为是打印到stdout
。如果您希望生成回档,请使用-i~
,这将为file
创建一个回档file~
。