Как выполнить скрипт для нескольких файлов с помощью 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: это выполнит четыре экземпляра одновременно,возможночто приводит к более эффективной обработке в зависимости от данных, оперативной памяти и оборудования:

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

Связанный контент