想象一个名为parent-folder
的文件夹,其中包含以下内容。父级包含子级,每个子级包含一个style.css文件。我需要一个bash脚本,将每个CSS文件重命名为_style.scss
。另外,我需要在每个样式表中添加@import 'glue1';
。
parent-folder
child-folder
style.css
child-folder
style.css
child-folder
style.css
这就是我所放在一起的。由于我对bash缺乏了解,我很难理解这一点。我发现编写脚本真的很难。
for file in */**; do
echo "@import 'glue1';"|cat - $file > /tmp/out && mv /tmp/out $file
echo ${file/%.css/.scss}
done;
从parent-folder
调用时脚本执行的操作:
@import 'glue1';
添加到每个css文件中。.css
.scss
的新文件路由
醇>
我的问题是......
什么是[this] ${file/%.css/.scss}
技术被调用,如何在文件名前添加_
(下划线)?
答案 0 :(得分:1)
${file/%.css/.scss}
被称为parameter expansion。您正在使用.css
后缀替换.scss
后缀。您可以使用参数扩展和其他一些功能组合完成重命名:
mv $file $(dirname $file)/_$(basename ${file/%.css/.scss})
然而,这似乎有点矫枉过正。如果您知道所有文件都需要重命名为_style.scss
,无论它们最初调用的是什么,那么您可以这样做:
mv $file $(dirname $file)/_style.scss
<强>简单:强>
事实上,如果您只想更改名为style.css
的文件(您当前的脚本会更改每个子目录中的每个文件),并且您知道它们都已被称为style.css
,那么这将是一种更简单的方法,它只遍历当前目录的每个子目录(而不是这些子目录中的所有文件):
for dir in */; do
echo "@import 'glue1';" | cat - "${dir}"style.css > /tmp/out && mv /tmp/out "${dir}"_style.scss
done
或写入文件,然后删除旧文件(这看起来更符合我的规范):
for dir in */; do
echo "@import 'glue1';" >"${dir}"_style.scss
cat "${dir}"style.scss >>"${dir}"_style.scss
rm "${dir}"style.scss
done
答案 1 :(得分:0)
您需要使用find
和dirname
命令进行重命名,并sed
将该行预先添加到文件内容中:
for i in `find . -name 'style.css'`; do
sed -i '1s;^;@import '"'"'glue1'"'"'\;\n;' $i;
mv $i "`dirname $i`/_style.scss";
done
如果您需要使用style.css
以外的文件名,您可能还需要basename
命令,该命令仅提取文件名,因此它与{{1}有些相反}。
还有dirname
命令替换文件名中的模式,但它似乎是一个过度复杂的案例。