我需要找到project.updated
某个嵌套目录中的所有文件,并使用这些文件来替换project.json
文件中的内容相同的目录。
我正在使用 BusyBox (1.33.1)。
/apps
/project1
project.json
project.updated
/project2
project.json
可以看到,project.updated
project1文件夹下有一个文件。该文件的内容应替换project.json
file.
只有当我知道确切的文件时,这才有效:
cat /apps/project1/project.updated > /apps/project1/project.json
由于有很多项目,但只有少数项目有文件,如何以动态方式执行此操作project.updated
?
答案1
使用find
and-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
因此没有必要。