【问题标题】:Bash loop through folders and rename fileBash遍历文件夹并重命名文件
【发布时间】:2016-08-07 06:25:08
【问题描述】:

想象一个名为parent-folder 的文件夹,其内容如下。父级包含子级,每个子级包含一个 style.css 文件。我需要一个将每个 CSS 文件重命名为 _style.scss 的 bash 脚本。另外,我需要在每个样式表前面加上@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. .scss替换.css的新文件路径回显

我的问题是……

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

【问题讨论】:

  • 阅读find 的手册页:它适用于这类任务。

标签: bash


【解决方案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

【讨论】:

  • ${dir} 应该用双引号括起来以防止通配符和分词。
  • 绝对正确且已修复。
【解决方案2】:

看起来您需要 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 命令,因此它与dirname 有点相反。

还有rename 命令可以替换文件名中的模式,但对于您的情况来说,这似乎过于复杂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-18
    • 2011-12-29
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 2011-12-30
    相关资源
    最近更新 更多