Shell
如何替換嵌套文件的內容?
我需要在某個嵌套目錄中查找所有文件,並使用這些文件對同一目錄中的
project.updated
文件進行內容替換。project.json
我正在使用 BusyBox (1.33.1)。
/apps /project1 project.json project.updated /project2 project.json
如您所見,
project.updated
project1 文件夾中有一個文件。此文件的內容應替換project.json
文件。這只有在我知道確切文件的情況下才有效:
cat /apps/project1/project.updated > /apps/project1/project.json
我如何以動態方式執行此操作,因為有很多項目並且其中只有少數有
project.updated
文件?
使用
find
and-execdir
which 在找到文件的目錄中執行給定的命令: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}"' {} \;
where在字元串的 END 處匹配
${0/%updated/json}
並將其替換為. 由於包含作為結果的整個路徑,因此沒有必要。updated``$0``json``$0``find``-execdir