따라서 기본적으로 여러 개의 .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
답변3
이를 해결하는 방법은 여러 가지가 있습니다. 예를 들어 find
다음과 같이 스크립트 호출을 요청할 수 있습니다.
$ find . -type f -name "*.csv" -exec your_script {} ;
{}는 매번 발견된 파일 이름입니다.
해당 문자를 이스케이프해야 할 수도 있습니다.
$ find . -type f -name "*.csv" -exec your_script \{\} \;