find를 사용하여 여러 파일에서 스크립트를 실행하는 방법은 무엇입니까?

find를 사용하여 여러 파일에서 스크립트를 실행하는 방법은 무엇입니까?

따라서 기본적으로 여러 개의 .csv 파일을 찾은 다음 모든 파일에 대해 제가 작성한 스크립트를 사용해야 합니다. 나는 가지고있다

find . -type f -name "*.csv" | xargs ./extractdata

이것은 작동하지만 필요한 모든 파일이 아닌 하나의 파일만 처리합니다. 돕다?

답변1

작동하지 않는 이유는 xargs가능한 한 많은 파일을 명령줄에 집어넣기 때문입니다.

따라서 "extractdata" 스크립트는 모든 파일을 한 번에 수신하고 아마도 첫 번째 매개변수만 처리할 것입니다. 즉, N개의 파일이 있고 실행합니다.하나스크립트 대모두파일을 매개변수로 사용합니다.

매개변수를 사용해야 합니다 -n.

... | xargs -n 1 ./extractdata

따라서 N개의 파일이 있고 N개의 스크립트를 실행할 수 있습니다.하나파일별 매개변수.

find그러나 이는 해당 옵션을 사용하여 실행하는 것과 거의 동일합니다 -exec(한 가지 차이점은 파일을 찾은 순서대로 처리하는 반면, 파이프를 사용하면 sort및/또는 를 사용하여 전달한 후에 이 작업을 수행한다는 것입니다 grep).

find ... -exec /path/to/extractdata \{\} \;

스크립트의 병렬 실행을 사용할 수도 있습니다 parallel. 이번에는 한 번에 4개의 인스턴스를 실행합니다.가능한데이터, RAM, 하드웨어를 기반으로 더욱 효율적인 처리를 지원합니다.

... | parallel -n 1 -j 4 ./extractdata

("extractdata"가 고정된 이름을 가진 임시 파일을 사용하는 경우 좋은 습관이 아니므로 병렬로 실행되는 두 개 이상의 스크립트가 서로의 임시 파일에 기록되어 문제가 발생합니다).

답변2

또 다른 옵션은 fd도구입니다.

fd csv -x ./extractdata

https://github.com/sharkdp/fd

답변3

find이 문제를 해결하는 방법은 여러 가지가 있습니다. 예를 들어 스크립트가 다음과 같이 호출되도록 요청할 수 있습니다 .

 $ find . -type f -name "*.csv" -exec your_script {} ;

{}는 매번 발견되는 파일 이름입니다.

다음 문자를 이스케이프해야 할 수도 있습니다.

 $ find . -type f -name "*.csv" -exec your_script \{\} \;

관련 정보