
파일을 읽고 수정된 버전을 출력하는 명령이 있습니다 stdout
.
./convert /path/to/file
이 명령을 디렉터리의 모든 파일에 어떻게 반복적으로 적용할 수 있습니까?위 명령의 결과로 각 파일의 기존 내용을 덮어씁니다.?
나는 찾았다이 질문이는 매우 유사하지만 제공되는 모든 솔루션에는 결과를 단일 파일로 출력하는 작업이 포함되는데 이는 내가 원하는 것이 아닙니다.
답변1
내가 올바르게 이해했다면 다음을 사용하여 하나의 파일을 변환할 수 있습니다.
./convert /path/to/file >/path/to/file.new
mv /path/to/file.new /path/to/file
디렉토리 트리의 모든 파일에 명령을 적용하려면 다음을 사용하십시오.find
공익사업. 각 파일에 대해 복잡한 명령을 실행해야 하므로 명시적으로 셸을 호출해야 합니다.
find /path/to/top/directory -type f -exec sh -c '
/path/to/convert "$0" >"$0.new" &&
mv "$0.new" "$0"
' {} \;
답변2
귀하가 연결한 질문은 재귀적으로 작동하지 않으며 한 수준 깊이에서만 작동합니다. 재귀의 경우 다음을 사용하십시오 find
.
find . -type f -exec /path/to/convert {} \;
convert
자신을 수정하려고 시도할 위험이 있으므로 걷고 있는 트리 밖으로 이동하려고 합니다 .
답변3
convert
내가 올바르게 이해했다면 각 입력 파일을 해당 입력 파일 의 결과로 덮어쓰고 싶을 것입니다 . 그렇다면 다음을 시도해 보세요.
find . -type f | while IFS= read -r file; do
./convert "$file" > /tmp/foo.tmp && mv /tmp/foo.tmp "$file";
done
답변4
@Gilles의 우수성에서 차용답변:
find /path/to/top/directory -type f -exec sh -c '/path/to/convert "$0" | tee "$0"' {} \;
위의 방법을 로 시도했는데 sed
효과가 있었습니다.