我有一个正在使用的克隆的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。任何帮助表示赞赏。谢谢。
答案 0 :(得分:1)
首先让我做一些假设:
./dir/a/config.js
./dir/b/config.js
do_conversion_script.sh
在以下位置创建config.js.csv
文件:
与config.js
相同的目录。config.js.csv
文件后添加一个后缀
在上面的示例中,其父名称为a
或b
。那又如何:
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%/*}
相反。前者可读性更好,后者节省了子进程。