Linux에 여러 디렉터리(및 하위 디렉터리)와 많은 PHP, JS, HTML, CSS 등 파일이 있는 PHP 애플리케이션이 있습니다. 많은 파일에 Windows EOL 제어 문자가 있으며 일부 파일은 UTF-8로 인코딩되지 않았지만 ISO-8859-1, Windows-1252 등일 수 있다는 점도 걱정됩니다. 내 소원은 LF만 사용하여 모든 파일을 UTF-8로 변환하는 것입니다.
이제 몇 걸음 남았을 것 같습니다.
dos2unix man은 다음 솔루션을 제공합니다.
find . -name *.txt |xargs dos2unix
https://stackoverflow.com/a/11929475이 솔루션은 다음과 같이 제공됩니다.
find . -type f -print0 | xargs -0 dos2unix
https://stackoverflow.com/a/7068241이 솔루션은 다음과 같이 제공됩니다.
find ./ -type f -exec dos2unix {} \;
첫 번째 솔루션은 내가 원하는 것이 아닌 txt 파일만 변환한다는 것을 알고 있지만 -type f
. 그렇다면 왜 그렇습니까? 파일을 변경하지 않고도 어떤 파일이 변경될지 알 수 있나요? 결국 날짜를 변경하면 날짜를 변경하고 싶지 않으며 dos2unix의 --keepdate
플래그를 사용할 계획입니다. 다른 옵션을 사용해야 합니까?
다음으로 인코딩을 처리해야 합니다. https://stackoverflow.com/a/805474/1032531권장 enca
(또는 자매 명령 encov
) 및https://stackoverflow.com/a/64889/1032531추천하다 iconv
. file
적용도 될 것 같습니다 . 다시 말하지만, 어느 것(또는 다른 것)을 사용해야 합니까? 설치 enca
하고 실행했을 때 enca --list languages
여러 언어가 나열되었지만 영어는 표시되지 않았습니다("없음"이 선택되었을 수도 있음). 제 질문은 적용 가능성입니다. iconv
이미 설치되어 있지만 매뉴얼 페이지는 없습니다(적어도 man iconv
). 이것을 어떻게 사용하여 인코딩을 재귀적으로 확인하고 변환할 수 있습니까?
제가 제안한 솔루션을 확인/수정하거나 완전한 솔루션을 제공해주세요.
답변1
많은 질문이 여기에 하나로 통합되었습니다.
첫째, find를 사용할 때 나는 항상 --exec
대신 를 사용합니다 xargs
. 일반적으로 작업을 수행하려면 가능한 적은 명령을 사용하는 것이 가장 좋습니다. 그리고 처음 두 가지 방법은 xargs가 파일 이름으로 다시 해석할 수 있도록 모든 파일 이름을 텍스트 스트림에 기록합니다. 이는 (확실히 작다) 실패할 확률.
dos2unix
여러 파일 이름을 허용하므로 다음을 사용합니다.
find . -type f -exec dos2unix --keepdate {} +
그러면 긴 파일 목록이 작성되고 dos2unix
한 번에 여러 파일이 시작됩니다.
어떤 파일이 터치되는지 확인하려면 exec 절을 제거하면 됩니다.
find . -type f
코딩 변경은 훨씬 더 큰 문제입니다. 텍스트 파일의 현재 인코딩은 확실하게 확인할 수 없습니다. 때로는 추측이 가능하지만 결코 100% 신뢰할 수는 없습니다. 따라서 현재 모든 파일이 동일한 인코딩으로 되어 있다고 확신하는 경우에만 인코딩을 일괄 처리할 수 있습니다.
를 사용하는 것이 좋습니다 iconv
. 이는 실제로 이 작업의 기본값이기도 합니다. 맨페이지는 여기에서 찾을 수 있습니다:
https://linux.die.net/man/1/iconv
다음은 다음 iconv
과 함께 사용하는 방법에 대한 실제 예 입니다 find
.
https://stackoverflow.com/questions/4544669/batch-convert-latin-1-files-to-utf-8-using-iconv