전체 디렉토리에서 dos2unix를 어떻게 실행할 수 있습니까? [닫은]


333

를 사용하여 전체 디렉토리를 변환해야합니다 dos2unix. 이 작업을 수행하는 방법을 알 수 없습니다.

답변:


591

find . -type f -print0 | xargs -0 dos2unix

재귀 적으로 현재 디렉토리 내의 모든 파일을 찾고이 파일을 호출합니다. dos2unix 명령


94
파일 이름에 공백이 있으면 중단됩니다. find . -type f -print0 | xargs -0 dos2unix내가 생각하는 문제를 해결할 것입니다.
Noufal Ibrahim

1
나는이 찾기처럼 주었다. -type f -exec dos2unix {} / home / venuk / Desktop / NEO_Src 다음 오류를 발견했습니다 :`-exec '에 인수 누락
Vivek Gaur

1
세미콜론을 이스케이프하는 백 슬래시는 dos2unix 명령이 세미콜론으로 분리되어 서로 으깨지지 않도록합니다. 나중에 다른 명령을 실행하려면 다른 세미콜론이 필요합니다.\;; echo Hello
Josh

1
이 명령은 파일 변환이 필요한지 여부를 확인하지 않으므로 이진 파일도 "변환"되어 손상됩니다.
vguzmanp

2
@vguzmanp True, find호출은이 검사를 수행하지 않지만 (추가하기에는 간단하지만) 현대 dos2unix는 이진 파일을 올바르게 건너 뜁니다.
Kyle Strand

68

큰 디렉토리 인 경우 여러 프로세서로 실행하는 것이 좋습니다.

find . -type f -print0 | xargs -0 -n 1 -P 4 dos2unix 

한 번에 1 개의 파일을 전달하고 4 개의 프로세서를 사용합니다.


1
이 방법은 dos2unix에 문제가 발생하더라도 계속된다는 장점이 있습니다! "--force"방법과 같은 것. 감사합니다!
freeo

와우-침대가 잘못 추가 된 Windows 개발자 코드 추가를 변환하려고 시도하는 동안 많은 문제 해결 시간을 절약했습니다. 감사합니다!!
NetYeti

1
각 개별 파일에 대해 새로운 dos2unix 프로세스를 시작하면 불필요한 오버 헤드가 발생합니다. 나는 n우리가 그것에 관해 이야기하고있는 파일의 수에 따라 2
배씩 증가시킬 것이다.

25

dos2unix가 만족스럽지 않으면 서 간단한 유틸리티를 공개했습니다. 속도와 예측 가능성의 몇 가지 장점 외에도 구문은 약간 더 간단합니다.

endlines unix *

그리고 하위 디렉토리로 이동하려면 (숨겨진 디렉토리 및 텍스트가 아닌 파일을 생략하십시오) :

endlines unix -r .

endlineshttps://github.com/mdolidon/endlines에서 사용할 수 있습니다


1
이것은 완벽 해요! 내가 얻을 수있는 가장 가까운 1 라이너는 여기에 있습니다 : unix.stackexchange.com/a/365679/112190
phyatt

2
그것은 어떻게 향상 dos2unix됩니까? 정말 궁금합니다.
Walf

3
1 / 주로 dos2unix다양한 기능을 가진 많은 톤이 있습니다 (일부 읽기 UTF32는 있지만 일부는 그렇지 않습니다. 엔드 라인은 그렇지 않습니다). endlines잘 알려진 기능은 하나뿐입니다 . 2 / 입력에 대한 자유, 모두 dos2unix가 아닙니다 . 3 / 효율적인 파일 트리 탐색, 수만 개의 파일에서 빠르고 실용적으로 설계되었습니다. 4 /는 OSX에서 즉시 사용됩니다. 이제 Brew 패키지가 존재하므로 덜 중요합니다.
Mathias Dolidon

1
제 경우에는 정말 감사해야 할 것이 었습니다. 환영받는 기능은 디렉토리 트리를 처리하는 쉬운 방법과 빠른 실행 시간입니다.
AlSavi

17

이 같은 숨김 파일 및 폴더 건너 아마 가장 좋은 .git.사용하는 대신 그래서를 find귀하의 경우, bash버전이 최근 충분히이 발생하거나 사용하는 경우 zsh, 단지 수행

dos2unix **

Bash의 경우 다음이 필요합니다.

shopt -s globstar

.... 그러나 이것은 당신이 솔직히 말해서 유용하게 사용할 수있는 충분한 기능입니다 .bashrc.

당신이 경우 하지 않는 숨김 파일 및 폴더를 제외하려면,하지만 여전히 건드리고 싶지 않아 find(내가 당신을 비난하지 않을), 당신은 일치하는 두 번째 재귀 글로브 인수 제공 할 수있는 유일한 숨겨진 항목 :

dos2unix ** **/.*

두 경우 모두 glob가 디렉토리를 포함하도록 확장되므로 다음과 같은 경고가 나타날 수 있습니다 (잠재적으로 여러 번). Skipping <dir>, not a regular file.


1
이것은 나를 위해 작동하지 않았습니다. globstar 구문이 dos2unix에서 작동합니까? 나는 globstar를 다른 곳에서 성공적으로 사용했지만 이것이 효과가 없었습니다. Bash 4.3.11 (1)을 사용하고 있습니다
NS du Toit

@NSduToit * NIX 스타일 쉘은 실행 파일이 인수 확장 동작을 변경하도록 허용하지 않습니다. 왜냐하면 Windows와 달리 인수 실행은 실행 파일이 인수를 받기 전에 수행되기 때문입니다. 제가 생각할 수있는 유일한 것은 여러분이 dos2unix인수가 확장되는 방식에 영향을주는 일종의 별칭이 있다는 것입니다 . type dos2unix시스템 의 출력은 무엇입니까 ?
Kyle Strand

1
@NSduToit 여기에 약간의 혼란이 있습니다. 내 대답은 명시 적으로한다고 포인트 사용 **대신은 find"같은 숨김 파일 및 폴더 표시를 생략하는 것입니다 .git." dos2unix숨겨진 파일 **은 표시되지 않으므로 확장되지 않습니다. 당신이 경우 원하는 자동으로 실행하기 위해 dos2unix숨김 파일 및 폴더에, 당신은 사용할 수 있습니다 find또는 dos2unix ** **/.***/.*확장됩니다 숨겨진 파일 및 폴더를 포함하여 .(루트 디렉토리), ..현재 폴더에 (부모 디렉토리) 및 기타 숨겨진 항목을.
Kyle Strand

1
(참고 것을 dos2unix간단하게는 인쇄 Skipping <dir>, not a regular file.그래서 실행, 디렉토리에 때 실행 ...결합, 또한. 안전) ls글로브 함께 하지 글로브 확장하는 방법을 확인하는 좋은 방법; 사용하는 echo대신 : echo **인수가 인쇄됩니다 dos2unix에서 수신을 dos2unix **.
Kyle Strand

1
감사합니다! 말이된다! 좋아, 나는 **암시적인 것에 대해 완전히 잘못된 생각을 가지고 있었고, echo그것을 사용 하면 분명해진다.
NS du Toit 2016 년

7

일반적인 사용 사례 는 Git 저장소에 커밋 된 모든 파일의 줄 끝표준화 하는 것으로 보입니다 .

git ls-files | xargs dos2unix

특정 파일 (예를 들어 있다는 사실을 숙지 *.sln, *.bat) 등 있습니다 의 Windows 운영 체제에서 사용한다 계속CRLF 종료를 :

git ls-files '*.sln' '*.bat' | xargs unix2dos

필요한 경우 .gitattributes


6

모든 Solaris 사용자의 경우 (오전 5.10을 사용중인 경우, 다른 유닉스 시스템뿐만 아니라 최신 버전에도 적용될 수 있음) :

dos2unix는 기본적으로 파일을 덮어 쓰지 않고 업데이트 된 버전을 stdout으로 인쇄하기 때문에 소스와 대상을 같은 이름으로 두 번 지정해야합니다.

find . -type f -exec dos2unix {} {} \;

2
for FILE in /var/www/html/files/*
do
 /usr/bin/dos2unix FILE
done

1
스택 오버플로에 오신 것을 환영합니다. 솔루션이 유효한 솔루션이지만 설명을 추가 할 수 있으면 좋을 것입니다. 답변을 정당화하기 위해 다른 답변을 참조 할 수도 있습니다. 한 번 봐 제발 답변하는 방법 자세한 정보를.
kvantour

2

나는 똑같은 문제를 겪었고 여기에서 해결 한 게시물 덕분에. 나는 약 100 개의 파일이 있다는 것을 알고 있었고 * .js 파일에 대해서만 파일을 실행해야했습니다. find . -type f -name '*.js' -print0 | xargs -0 dos2unix

도와 주셔서 감사합니다.


0

가장 간단한 방법은 다음과 같습니다.

dos2unix $(find . -type f)

0

나는 이것을 백만 번처럼 Google 검색 했으므로 내 솔루션은이 bash 함수를 환경에 넣는 것입니다.

.bashrc또는 .profile무엇이든

dos2unixd() {
  find $1 -type f -print0 | xargs -0 dos2unix
}

용법

$ dos2unixd ./somepath

이렇게하면 여전히 원래 명령이 있으며이 명령 dos2unix을 기억하기 쉽습니다 dos2unixd.


-1

하위 디렉토리가 없으면 다음을 수행 할 수도 있습니다.

ls | xargs -I {} dos2unix "{}"

4
하위 디렉토리가없는 경우 dos2unix *더 단순하고 실제로 이보다 더 강력합니다. (의 출력 ls도구는 형식화 도구이므로 *프로그래밍 방식으로보다 안정적 이기 때문에 일반적으로의 출력을 파이프하는 것은 권장되지 않습니다 .)
Kyle Strand

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.