
모든 텍스트 파일이 개행 문자로 끝나는 것을 보장하는 스크립트를 작성하려고 합니다.
특정 폴더에서 이 명령을 실행하면 다음과 같습니다.
find . -exec ed -s {} <<< w \;
다음과 같은 결과가 나타납니다.
Newline appended
Newline appended
Newline appended
Newline appended
Newline appended
Newline appended
Newline appended
Newline appended
Newline appended
Newline appended
Newline appended
좋아, 그런데 어떤 파일에 개행 문자가 추가되었나요? Git 기록에서 어떤 변경 사항도 볼 수 없는데, 추적되지 않은 파일도 그렇습니까?
또한 텍스트 파일 중 하나의 끝에서 의도적으로 개행 문자를 제거하고 ed
다시 추가하지 않습니다...
답변1
가 아닌 에 <<<
연결된 입력 리디렉션(here-string)과 마찬가지로 명령이 약간 잘못되었습니다 .find
ed
명령을 약간 확장하려면 다음을 수행하십시오.
find . -type f -exec sh -c '
for pathname do
echo w | ed -s "$pathname"
done' sh {} +
이는 현재 디렉토리나 그 아래의 일반 파일에만 영향을 미치며 ed
. 바이너리 파일도 일반 파일이므로 텍스트 파일이 포함된 디렉터리에서만 이 파일을 실행한다고 가정해야 합니다(컴파일된 실행 파일, 이미지 파일 등을 손상시키지 않기 위해).
일반 파일 배치의 경우 짧은 인라인 쉘 스크립트를 호출합니다. 스크립트는 에서 제공한 경로 이름을 반복하여 find
에서 각각 열어 ed
파일을 즉시 저장합니다. 이는 아직 개행 문자로 끝나지 않은 파일에 개행 문자를 추가합니다.
이에 의해 실제로 수정된 파일에 대한 힌트를 얻으려면 를 호출하기 전에 경로 이름을 인쇄하십시오 ed
. 이것은 출력됩니다모두경로 이름을 찾았지만 그 중 일부 뒤에는 "새 줄 추가" 메시지가 목록에 표시됩니다.
find . -type f -exec sh -c '
for pathname do
printf "%s\n" "$pathname"
echo w | ed -s "$pathname"
done' sh {} +
이로 인해 실제로 수정된 파일을 검색하려면 임시 파일에 쓰고 원본 파일과 비교한 후 차이가 있으면 원본을 임시 파일로 바꿀 수 있습니다.
find . -type f -exec sh -c '
tmpfile=$(mktemp); trap "rm -f \"$tmpfile\"" EXIT
for pathname do
printf "w %s\n" "$tmpfile" | ed -s "$pathname" 2>/dev/null
if ! cmp -s "$tmpfile" "$pathname"; then
printf "Fixed %s\n" "$pathname"
mv "$tmpfile" "$pathname"
fi
done' sh {} +
이는 실제로 수정한 파일이 아닌 파일의 타임스탬프를 업데이트하지 않는다는 추가 이점이 있습니다.
ed
이는 또한 파일이 실제로 수정될 때마다 "Newline added" 메시지를 표시하지 않고 대신 사용자 정의 메시지를 출력합니다.
또한보십시오: