Shell

如何替換嵌套文件的內容?

  • January 13, 2022

我需要在某個嵌套目錄中查找所有文件,並使用這些文件對同一目錄中的project.updated文件進行內容替換。project.json

我正在使用 BusyBox (1.33.1)。

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

如您所見,project.updatedproject1 文件夾中有一個文件。此文件的內容應替換project.json文件。

這只有在我知道確切文件的情況下才有效:

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

我如何以動態方式執行此操作,因為有很多項目並且其中只有少數有project.updated文件?

使用findand -execdirwhich 在找到文件的目錄中執行給定的命令:

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

引用自:https://unix.stackexchange.com/questions/686228