如何在文件夹中的文件上运行Bash脚本并保留文件夹名称?

时间:2019-12-10 22:43:43

标签: bash

我有一个正在使用的克隆的git repo。每个文件夹中都有一个名为config.js的文件。我有一个脚本,应该将回购文件中以.js结尾的每个文件转换为csv,并将其重命名为foldername.config.js.csv。我应该使用什么Bash循环来完成此任务?原谅我,因为我一点都不了解Bash,但据我所知我做到了:

for NAME in `find . -iname 'config.js'`; do 
        DIRNAME=`echo $NAME | cut -d \/ -f 3` 
        ./do_conversion_script.sh $NAME
        mv config.js.csv $DIRNAME.config.js.csv
done

这成功地将脚本应用于所有文件,但仅转换了文件,并在文件末尾添加了.csv。因此,它没有给我foldername.config.js.csv,而是给了我config.js.csv。任何帮助表示赞赏。谢谢。

2 个答案:

答案 0 :(得分:1)

首先让我做一些假设:

  • 您的目录树如下所示:
    ./dir/a/config.js
    ./dir/b/config.js
  • do_conversion_script.sh在以下位置创建config.js.csv文件: 与config.js相同的目录。
  • 您要在config.js.csv文件后添加一个后缀 在上面的示例中,其父名称为ab
  • 重命名的文件与以前位于同一目录中。
  • 父名称不重复。
  • 路径名不包含空格,制表符和换行符。

那又如何:

for name in $(find . -iname 'config.js'); do
    dir="${name%/*}"
    prefix="${dir##*/}"
    ./do_conversion_script.sh "$name"
    mv -- "$dir/config.js.csv" "$dir/$prefix.config.js.csv"
done

您可能需要使用两个变量来保存当前目录中的完整目录名称,而另一个变量只保留父名称。

希望这会有所帮助。

答案 1 :(得分:1)

您计算DIRNAME的方式没有任何意义。说我有没有

NAME=a/b/c
echo $NAME | cut -d \/ -f 3

这将产生c,而不是a/b

您可以使用

DIRNAME=$(dirname $NAME)

DIRNAME=${NAME%/*}

相反。前者可读性更好,后者节省了子进程。