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 \{\} \;

관련 정보