Bash循环文件夹并重命名文件

时间:2016-08-07 06:25:09

标签: bash

想象一个名为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调用时脚本执行的操作:

  1. 循环遍历每个子目录
  2. 通过创建临时文件将@import 'glue1';添加到每个css文件中。
  3. 使用.css
  4. 回复替换.scss的新文件路由

    我的问题是......

    什么是[this] ${file/%.css/.scss}技术被调用,如何在文件名前添加_(下划线)?

2 个答案:

答案 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)

您需要使用finddirname命令进行重命名,并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命令替换文件名中的模式,但它似乎是一个过度复杂的案例。