중첩된 파일의 내용을 바꾸는 방법은 무엇입니까?

중첩된 파일의 내용을 바꾸는 방법은 무엇입니까?

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

파일이 있는 디렉토리에서 주어진 명령을 실행하려면 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

관련 정보