这有点疯狂,但我想知道这是否可能。
例如,我的文件夹中可能有 300 个文件夹/var/www
,它们全部重命名为相同的名称。[Name](Num)
kindred (19)
几乎每个文件夹都有一个名为的文件,package.json
所有文件都有一个name
键值对,其中包含项目的名称。
{
"name": "a useful project name",
......
"main": "src/index.js",
}
我希望包含的文件夹package.json
被重命名为文件内“名称”的值package.json
。
答案1
当您需要解析 json 文件时,可以使用的更好的工具之一是jq
。这使得name
从package.json
目录中的文件中提取字段变得容易。执行重命名是一个简单的 shell 脚本:
$ cd /var/www
$ for d in */; do # *1
> if [ -f "${d}package.json" ]; then # *2
> new_name=$(jq -e -M -r .name "${d}package.json") # *3
> if [ $? -eq 0 ] && ! [ -e "${new_name}" ]; then # *4
> mv "${d}" "${new_name}" # *5
> fi
> fi
> done
一些注意事项:
*1:*/
扩展到当前目录下的所有目录。每个目录名称/
末尾都会包含一个,因此我们不会在 *2 和 *3 后面添加一个。
*2:仅处理有package.json
文件的目录。
*3:调用jq
从 中提取名称字段package.json
。我们调用jq
with-r
来输出原始字符串(即省略双引号),with-M
不具有彩色输出,并且如果没有字段则退出并返回-e
错误。jq
name
*4:检查是否jq
成功运行(有一个name
字段)并且目录的新名称尚不存在。else
如果您想为跳过重命名的两种情况输出错误消息,您可能需要将它们分开并添加 。
*5:重命名目录。
对于测试运行,我将其放在命令echo
前面的mv
*5 处并检查输出以查看重命名是否正确。我自己没有测试过这个,因为我没有一堆带有package.json
文件的目录。