디렉터리의 모든 파일을 수정하려면 명령을 반복적으로 적용하세요.

디렉터리의 모든 파일을 수정하려면 명령을 반복적으로 적용하세요.

파일을 읽고 수정된 버전을 출력하는 명령이 있습니다 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효과가 있었습니다.

관련 정보