
Так что по сути мне нужно найти кучу .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
: это выполнит четыре экземпляра одновременно,возможночто приводит к более эффективной обработке в зависимости от данных, оперативной памяти и оборудования:
... | 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 \{\} \;