dos2unix
폴더 및 해당 하위 폴더의 모든 파일에 대해 실행되도록 이 명령을 적용하는 방법이 있습니까 ? 이 작업을 쉽게 수행할 수 있는 유사한 옵션이 man dos2unix
표시되지 않습니까 -r
?
답변1
find /path -type f -print0 | xargs -0 dos2unix --
답변2
사용 bash
:
shopt -s globstar
dos2unix **
쉘 globstar
옵션을 사용 bash
하면 globs를 사용할 수 있습니다 **
. 이는 pathname 과 유사 *
하지만 /
경로 이름과 일치합니다(따라서 하위 디렉터리의 이름도 마찬가지입니다). 이는 하위 디렉터리에 적당한 수의 파일(천 개가 아닌)이 있는 디렉터리에 적용됩니다.
zsh
In 및 쉘 yash
( set -o extended-glob
in 사용 yash
)에서는 다음을 수행합니다.
dos2unix **/*
답변3
나에게는 바이너리 파일과 숨겨진 파일을 건너뛰는 것이 중요합니다.
이것은 나에게 잘 작동합니다.
find . -type f -not -path '*/\.*' -exec grep -Il '.' {} \; | xargs -d '\n' -L 1 dos2unix -k
즉, 현재 디렉터리에서 숨겨지지 않은 모든 파일을 재귀적으로 찾은 다음 grep을 사용하여 바이너리가 아닌(-I) 비어 있지 않은 모든 파일을 나열한 다음 한 번에 한 파일씩 xargs(새 줄로 구분)로 파이프합니다. 그리고 원래 타임스탬프를 유지하세요.
또한보십시오:
답변4
dos2unix
여러 프로세스를 사용하여 원하는 디렉터리나 경로에서 반복적으로 실행(또는 다른 명령)하는 방법
이 답변은 "사용 방법 xargs
"도 암시적으로 다룹니다.
최고를 조합했어요이 답변,이 답변, 그리고이 답변, 내 답변을 작성하면 귀하의 필요에 따라 3가지 별도의 솔루션이 있습니다.
실행
dos2unix
(또는 다른 명령)전체 디렉토리의 모든 파일.find . -type f -print0 | xargs -0 -n 50 -P $(nproc) dos2unix
(참고: 하세요아니요git 저장소에서 위 명령을 실행하세요. 그렇지 않으면 디렉터리의 내용이 손상되어
.git
처음부터 디렉터리를 다시 복제해야 합니다! git 디렉터리의 경우 dir을 제외해야 합니다.git
. 아래 해결 방법을 참조하세요. )실행
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
실행
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%까지 활용하게 되었습니다.
설명하다:
dos2unix
는 우리가 실행하는 명령입니다xargs
.- in,
-print0
in 및 in all은 "0으로 구분된" 또는 "null로 구분된" 파일 경로 목록을 나타냅니다. 이렇게 하면 특수 문자와 공백이 포함된 파일 경로를 구분하는 이진수 0을 찾기만 하면 쉽게 구분할 수 있습니다.find
-0
xargs
-z
git ls-files
nproc
컴퓨터에 있는 CPU 코어 수를 나열하십시오(예: 8). 따라서 통과는-P $(nproc)
명령을 실행하기 위해 코어가 있는 만큼 많은 프로세스를 생성하는 것을 의미합니다(dos2unix
우리의 경우). 이러한 방식으로 우리는 각 CPU 코어에 대한 작업자 프로세스를 생성하여 런타임을 최적화하려고 합니다.xargs
파이프로 연결된 입력의 스트림에서 개별 명령을 실행할 수 있습니다.-n 50
합격이라고 말해50개의 파일 경로명령을 실행하는 각 프로세스를 생성합니다( 우리의 경우). 이렇게 하면 하나 또는 두 개 또는 몇 개의 파일 대신 여러 파일을 한 번에 처리하기 때문에dos2unix
새 프로세스 생성에 따른 오버헤드가 줄어듭니다 .dos2unix
find .
-type f
현재 디렉터리( )에서 파일( )을 찾습니다.
.git ls-files
git 저장소의 모든 파일을 나열합니다.--
git ls-files
이 함수에 대한 옵션이 더 이상 존재하지 않음을 파서에 표시하여 전달된 옵션을 종료합니다. 이렇게 하면 뒤에 오는 모든 항목이--
파일 또는 폴더 경로 목록이 될 것임을 알 수 있습니다.
인용하다:
- 위에 링크된 3가지 답변입니다.
- 어디서 배웠나요
nproc
?명령줄에서 Linux의 CPU/코어 수를 얻는 방법은 무엇입니까? - 내 대답은를 사용할 때 디렉토리를 제외하는 방법은 무엇입니까
find
?
또한보십시오:
- 텍스트 파일에서 줄 끝을 찾는 방법은 무엇입니까?-줄 끝만 보려면 위 명령에서
file
대신 사용하십시오.dos2unix
현재특정 디렉토리의 모든 파일에 대해. - 내 대답:Git의 파일 제한(수 및 크기)은 무엇입니까?
- GitHub: 줄 끝을 처리하도록 Git 구성
- 매개변수 배치를 지정하는 옵션을
xargs
추가하는 또 다른 예 :-I{}
병렬 작업(프로세스당 하나의 CPU 코어, 코어 수만큼의 프로세스)을 사용하여 여러 파일을 zip 파일과 동일한 이름의 출력 디렉터리에 동시에 압축 해제하는 방법 - 때로는 with 와 같이 올바른 교체를 얻기 위해
bash -c
with 를 사용해야 하는 경우도 있습니다 . 이봐:xargs
dirname
스택 오버플로: find 명령에서 dirname을 사용하면 왜 각 일치 항목에 점수가 제공됩니까?xargs
내 저장소에서 .zip 파일을 추출하기 위해 일부 명령과 함께 이 트릭을 사용했습니다 .https://github.com/ElectricRCAaircraftGuy/FatFs. 이러한 명령에 대해서는 Readme 파일을 참조하십시오xargs
.