如何替换嵌套文件的内容?

如何替换嵌套文件的内容?

我需要找到project.updated某个嵌套目录中的所有文件,并使用这些文件来替换project.json文件中的内容相同的目录。

我正在使用 BusyBox (1.33.1)。

/apps
    /project1
        project.json
        project.updated
    /project2
        project.json

可以看到,project.updatedproject1文件夹下有一个文件。该文件的内容应替换project.jsonfile.

只有当我知道确切的文件时,这才有效:

cat /apps/project1/project.updated > /apps/project1/project.json

由于有很多项目,但只有少数项目有文件,如何以动态方式执行此操作project.updated

答案1

使用findand-execdir在找到文件的目录中执行给定的命令:

find /apps -type f -name '*updated'\
-execdir bash -c 'cat "$0" > "$(basename "$0" .updated).json"' {} \;

对于空运行,只需echo先执行命令,然后打印找到的文件:

find /apps -type f -name '*updated' -print\
-execdir bash -c 'echo cat "$0" \> "$(basename "$0" .updated).json"' {} \;

请不要忘记在这里逃避重定向\>

(如果您需要便携,也可以与 一起使用sh,并且符合 POSIX 标准)


如果-execdir不可用,-exec也可以,但也需要定义dirname目标文件的:

find /apps -type f -name '*updated'\
-exec bash -c 'cat "$0" > "$(dirname "$0")/$(basename "$0" .updated).json"' {} \;

或者更简单,但不可用于sh

find /apps -type f -name '*updated'\
-exec bash -c 'cat "$0" > "${0/%updated/json}"' {} \;

其中${0/%updated/json}匹配updated字符串的末尾$0并将其替换为json.由于$0包含整个路径作为 的结果find-execdir因此没有必要。

相关内容