-find 명령에서 -exec를 xargs로 변환

-find 명령에서 -exec를 xargs로 변환

dos2unixWindows에서 Linux로 복사된 파일에 대한 작업을 수행하기 위해 스크립트에서 다음 명령을 사용하고 있습니다 . 파일 수가 많기 때문에 이 작업에는 시간이 꽤 오래 걸립니다.

이것을 최적화하기 위해 인터넷을 검색한 결과 xargswith를 find대신 사용하여 -exec성능을 향상시킬 수 있다는 것을 알았지만 다음을 with로 사용하도록 변환하는 데 어려움을 겪고 있습니다 xargs.

find /path_to_files/ -exec bash -c 'dos2unix -k -n "{}" tmp_file && mv tmp_file "{}"' \;

답변1

실제로는 훨씬 더 간단합니다. 플래그를 지정하지 않으면 개체 파일이 이미 수정되었기 mv때문에 셸을 호출하거나 사용할 필요가 없습니다 .dos2unix-n

find /path_to_files -type f -exec dos2unix -k -q -- {} +

-type f이 방법으로 find는 디렉토리가 아닌 일반 파일만 검색합니다. 표준 출력에 정보 메시지를 쓰지 않도록 -q플래그를 지정합니다 . 대신 우리는 발견된 각 파일에 대해 프로세스를 호출 하지 않고 인수( )만큼 많은 파일을 제공 하도록 find를 dos2unix사용합니다 .{} +{} \;dos2unixdos2unix file1 file2 file3 ...

Xargs는 추가 프로세스일 뿐이므로 추가 시간 패널티가 발생합니다. 가능하면 새 프로세스를 호출하지 마세요.

답변2

~/bin파일 목록을 처리 하는 스크립트를 만들고 이름을 doit, 다음을 포함합니다.

#!/bin/bash
while [[ $# -ne 0 ]] ; do
    thisfile="$1"
    shift
    dos2unix -k -n "$thisfile" tmp_file
    mv tmp_file "$thisfile"
done

그 다음에,

chmod +x ~/bin/doit

마침내,

find /path/to/files -type f -print0 | \
    xargs -0 -r $HOME/bin/doit

읽다 man find xargs bash.

관련 정보