폴더의 모든 내용에 dos2unix를 재귀적으로 적용하는 방법은 무엇입니까?

폴더의 모든 내용에 dos2unix를 재귀적으로 적용하는 방법은 무엇입니까?

dos2unix폴더 및 해당 하위 폴더의 모든 파일에 대해 실행되도록 이 명령을 적용하는 방법이 있습니까 ? 이 작업을 쉽게 수행할 수 있는 유사한 옵션이 man dos2unix표시되지 않습니까 -r?

답변1

find /path -type f -print0 | xargs -0 dos2unix --

답변2

사용 bash:

shopt -s globstar
dos2unix **

globstar옵션을 사용 bash하면 globs를 사용할 수 있습니다 **. 이는 pathname 과 유사 *하지만 /경로 이름과 일치합니다(따라서 하위 디렉터리의 이름도 마찬가지입니다). 이는 하위 디렉터리에 적당한 수의 파일(천 개가 아닌)이 있는 디렉터리에 적용됩니다.

zshIn 및 쉘 yash( set -o extended-globin 사용 yash)에서는 다음을 수행합니다.

dos2unix **/*

답변3

나에게는 바이너리 파일과 숨겨진 파일을 건너뛰는 것이 중요합니다.

이것은 나에게 잘 작동합니다.

find . -type f -not -path '*/\.*' -exec grep -Il '.' {} \; | xargs -d '\n' -L 1 dos2unix -k

즉, 현재 디렉터리에서 숨겨지지 않은 모든 파일을 재귀적으로 찾은 다음 grep을 사용하여 바이너리가 아닌(-I) 비어 있지 않은 모든 파일을 나열한 다음 한 번에 한 파일씩 xargs(새 줄로 구분)로 파이프합니다. 그리고 원래 타임스탬프를 유지하세요.

또한보십시오:

https://github.com/mdolidon/endlines

답변4

dos2unix여러 프로세스를 사용하여 원하는 디렉터리나 경로에서 반복적으로 실행(또는 다른 명령)하는 방법

이 답변은 "사용 방법 xargs"도 암시적으로 다룹니다.

최고를 조합했어요이 답변,이 답변, 그리고이 답변, 내 답변을 작성하면 귀하의 필요에 따라 3가지 별도의 솔루션이 있습니다.

  1. 실행 dos2unix(또는 다른 명령)전체 디렉토리의 모든 파일.

    find . -type f -print0 | xargs -0 -n 50 -P $(nproc) dos2unix
    

    (참고: 하세요아니요git 저장소에서 위 명령을 실행하세요. 그렇지 않으면 디렉터리의 내용이 손상되어 .git처음부터 디렉터리를 다시 복제해야 합니다! git 디렉터리의 경우 dir을 제외해야 합니다 .git. 아래 해결 방법을 참조하세요. )

  2. 실행 dos2unix(또는 다른 명령)전체 Git 저장소의 모든 파일 또는 모든 체크인 파일:

    # A) Use `git ls-files` to find just the files *checked-in* to the repo.
    git ls-files -z | xargs -0 -n 50 -P $(nproc) dos2unix
    
    # Or B): use `find`, to find all files in this dir, period, but exclude the
    # `.git` dir so we don't damage the repo. 
    # - See my answer on excluding directories using `find`:
    #   https://stackoverflow.com/a/69830768/4561887
    find . -not \( -path "./.git" -type d -prune \) -type f -print0 \
        | xargs -0 -n 50 -P $(nproc) dos2unix
    
  3. 실행 dos2unix(또는 다른 명령)지정된 디렉터리의 모든 파일 또는 git 저장소의 모든 체크인 파일:

    # 1. only in this one directory: "path/to/dir1":
    
    # A) Use `git ls-files` to find just the files checked-in to the repo.
    git ls-files -z -- path/to/dir1 | xargs -0 -n 50 -P $(nproc) dos2unix
    
    # Or B): use `find` to find all files in this repo dir, period.
    find path/to/dir1 -type f -print0 | xargs -0 -n 50 -P $(nproc) dos2unix
    
    
    # 2. in all 3 of these directories:
    
    # A) Use `git ls-files` to find just the files checked-in to the repo.
    git ls-files -z -- path/to/dir1 path/to/dir2 path/to/dir3 \
        | xargs -0 -n 50 -P $(nproc) dos2unix
    
    # Or B): use `find` to find all files in these 3 repo dirs, period. Note
    # that by specifying specific folders you are automatically excluding the
    # `.git` dir, which is what you need to do.
    find path/to/dir1 path/to/dir2 path/to/dir3 -type f -print0 \
        | xargs -0 -n 50 -P $(nproc) dos2unix
    

속도:

불행히도 나는 그것을 실행하는 데 걸린 시간을 기록하지 않았지만 git ls-files -z | xargs -0 -n 50 -P $(nproc) dos2unix위의 명령이 대략적으로 변환되었다는 것을 알고 있습니다.내 거대한 Git 저장소에는 150만 개의 파일이 있습니다.3분 안에. 위에서 사용한 다중 프로세스 명령이 도움이 되었습니다., 결과적으로 전체 프로세스 동안 내 컴퓨터의 전체 CPU 처리 능력(20개 코어로 구성)을 최대 90%까지 활용하게 되었습니다.

설명하다:

  1. dos2unix는 우리가 실행하는 명령입니다 xargs.
  2. in, -print0in 및 in all은 "0으로 구분된" 또는 "null로 구분된" 파일 경로 목록을 나타냅니다. 이렇게 하면 특수 문자와 공백이 포함된 파일 경로를 구분하는 이진수 0을 찾기만 하면 쉽게 구분할 수 있습니다.find-0xargs-zgit ls-files
  3. nproc컴퓨터에 있는 CPU 코어 수를 나열하십시오(예: 8). 따라서 통과는 -P $(nproc)명령을 실행하기 위해 코어가 있는 만큼 많은 프로세스를 생성하는 것을 의미합니다( dos2unix우리의 경우). 이러한 방식으로 우리는 각 CPU 코어에 대한 작업자 프로세스를 생성하여 런타임을 최적화하려고 합니다.
  4. xargs파이프로 연결된 입력의 스트림에서 개별 명령을 실행할 수 있습니다.
  5. -n 50합격이라고 말해50개의 파일 경로명령을 실행하는 각 프로세스를 생성합니다( 우리의 경우). 이렇게 하면 하나 또는 두 개 또는 몇 개의 파일 대신 여러 파일을 한 번에 처리하기 때문에 dos2unix새 프로세스 생성에 따른 오버헤드가 줄어듭니다 .dos2unix
  6. find .-type f현재 디렉터리( )에서 파일( )을 찾습니다 ..
  7. git ls-filesgit 저장소의 모든 파일을 나열합니다.
    1. --git ls-files이 함수에 대한 옵션이 더 이상 존재하지 않음을 파서에 표시하여 전달된 옵션을 종료합니다. 이렇게 하면 뒤에 오는 모든 항목이 --파일 또는 폴더 경로 목록이 될 것임을 알 수 있습니다.

인용하다:

  1. 위에 링크된 3가지 답변입니다.
  2. 어디서 배웠나요 nproc?명령줄에서 Linux의 CPU/코어 수를 얻는 방법은 무엇입니까?
  3. 내 대답은를 사용할 때 디렉토리를 제외하는 방법은 무엇입니까 find?

또한보십시오:

  1. 텍스트 파일에서 줄 끝을 찾는 방법은 무엇입니까?-줄 끝만 보려면 위 명령에서 file대신 사용하십시오.dos2unix현재특정 디렉토리의 모든 파일에 대해.
  2. 내 대답:Git의 파일 제한(수 및 크기)은 무엇입니까?
  3. GitHub: 줄 끝을 처리하도록 Git 구성
  4. 매개변수 배치를 지정하는 옵션을 xargs추가하는 또 다른 예 :-I{}병렬 작업(프로세스당 하나의 CPU 코어, 코어 수만큼의 프로세스)을 사용하여 여러 파일을 zip 파일과 동일한 이름의 출력 디렉터리에 동시에 압축 해제하는 방법
  5. 때로는 with 와 같이 올바른 교체를 얻기 위해 bash -cwith 를 사용해야 하는 경우도 있습니다 . 이봐:xargsdirname스택 오버플로: find 명령에서 dirname을 사용하면 왜 각 일치 항목에 점수가 제공됩니까?
    1. xargs내 저장소에서 .zip 파일을 추출하기 위해 일부 명령과 함께 이 트릭을 사용했습니다 .https://github.com/ElectricRCAaircraftGuy/FatFs. 이러한 명령에 대해서는 Readme 파일을 참조하십시오 xargs.

관련 정보