Простая параллельная обработка с xargs

4 min

language: ja bn en es hi pt ru zh-cn zh-tw

Привет, я Муноу.
Извините за долгое отсутствие публикаций, но я жив.

Я купил подержанный Ryzen 5, и, к моему удивлению, у него были погнуты контакты, и распознавалась только одна планка памяти, среди прочих инцидентов, но я как-то справляюсь.
Я дешево купил еще одну материнскую плату AM4 формата M-ATX, так что думаю использовать этот чип Ryzen для сборки мини-ПК.

Удобный xargs

xargs - Wikipedia
Команда xargs, существующая как команда UNIX, очень удобна.
Сначала я не привык к ней, но чем больше я ее использую, тем больше универсальности нахожу. Это очень хорошая команда, которая даже устраняет необходимость писать простые циклы в одну строку.

Случай использования

Например, предположим, что у вас есть видео, которые вы хотите сохранить с помощью yt-dlp, и они перечислены по одной строке.

url1
url2
url3

Естественно, если передать все в единую пакетную параллельную обработку, нагрузка на процессор станет интенсивной, поэтому, если вы хотите запустить это по 2 процесса за раз, вы можете написать это следующим образом.

cat url-txt | xargs -I {} -P 2 yt-dlp {}

Удивительно, но с помощью этого вы можете обрабатывать по 2 процесса за раз.

Давайте разберем

Итак, как это работает?
Вышеизложенное эквивалентно следующему:

yt-dlp url1 ; yt-dlp url2
yt-dlp url3

Механически это означает, что команда, переданная xargs, выполняется каждый раз.
Это похоже на чтение строки с помощью read line и сохранение ее в виде массива?

Что если без опций?

Без опций все аргументы передаются сразу команде, заданной xargs.
Поскольку совместимые команды ограничены, мне кажется, лучше использовать опцию -I.
В таких случаях, как следующий:

cat url-txt | xargs yt-dlp

В этом случае была бы выполнена следующая команда:

yt-dlp url1 url2 url3

Поэтому, кажется, лучше обрабатывать с помощью -I, когда это возможно, но в некоторых ситуациях может быть нормально и без опций.

Случай использования 2

Это также полезно, когда вы хотите grep или sed только определенные имена файлов с помощью команды find.

find . -name "testfile" | xargs -I {} grep "return 0" {}

Таким образом, можно grep только определенные файлы с таким коротким описанием.


На сегодня все.
До новых встреч.

Related Posts