入れ子になったファイルの内容を置き換える方法は?

入れ子になったファイルの内容を置き換える方法は?

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

ベストアンサー1

ファイルがあるディレクトリから指定されたコマンドを実行するには、findおよびを使用します。-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$0json$0find-execdir

おすすめ記事