따라서 기본적으로 여러 개의 .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 \{\} \;