Как выполнить скрипт для нескольких файлов с помощью find?

rename(1)

rename— это Perl-скрипт Ларри Уолла, создателя Perl. Он принимает регулярное выражение Perl и работает с именем файла.

rename 's/\.txt$/.tsv/' *.txt

Установка

Дебиан/Убунту

Если вам нужно установить renameна Debian/Ubuntu, вы можете сделать

sudo apt install rename
2
03.04.2020, 03:07
3 ответа

Есть много способов решить эту проблему, например, вы можете попросить findвызвать скрипт, вот так:

 $ find. -type f -name "*.csv" -exec your_script {} ;

{} — это имя файла, которое каждый раз находилось.

Возможно, вам придется экранировать эти символы:

 $ find. -type f -name "*.csv" -exec your_script \{\} \;
0
28.04.2021, 23:18

Причина, по которой это не сработало, заключается в том, что xargsвпихнет столько файлов в командную строку, сколько сможет.

Таким образом, ваш скрипт "extractdata" получит все файлы сразу и, возможно, обработает только первый аргумент. т.е. у вас есть N файлов, вы выполняете один скрипт с всеми файлами в качестве аргумента.

Вам нужно использовать аргумент -n:

... | xargs -n 1./extractdata

Таким образом, у вас есть N файлов, вы выполняете N сценариев с одним файловым аргументом в каждом.

Вы также можете выполнять свой сценарий параллельно, используяparallel:при этом выполняется четыре экземпляра одновременно, возможно, что приводит к более эффективной обработке в зависимости от данных, ОЗУ и оборудования:

... | parallel -n 1 -j 4./extractdata

(Если «extractdata» использует временные файлы с фиксированными именами, что не является хорошей практикой, тогда два или более скриптов, выполняющихся параллельно, будут записывать временные файлы друг друга, что приведет к путанице ).

0
28.04.2021, 23:18

Другим вариантом является инструмент fd:

.
fd csv -x./extractdata

https://github.com/sharkdp/fd

1
28.04.2021, 23:18

Теги

Похожие вопросы