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
및 를 사용하십시오 .-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