Распараллеливание рекурсивного удаления с помощью find

Python может быть хорошим альтернативным инструментом для этого:

$ python -c "import sys;lines=[str(i)+' & '+l for i,l in enumerate(sys.stdin,1)]; print ''.join(lines)" < input.txt      
1 & What & South Dragon & North Dragon    & 5 \\ \hline
2 & What & South Dragon & North Dragon    & 5 \\ \hline
3 & What & South Dragon & North Dragon    & 5 \\ \hline

Это работает так, что мы перенаправляем текст в stdin Python и читаем строки оттуда. Функция enumerate () - это то, что дает количество строк, при этом sys.stdin указан в качестве входных данных, а 1 является начальным индексом. Остальное просто - мы составляем список новых строк, преобразовывая index как строку, соединенную вместе со строкой '&' , и самой строкой. Наконец, все, что собрано из списка, в один тест с помощью функции ''. Join () .

В качестве альтернативы, вот многострочная версия файла сценария или просто для удобства чтения:

#!/usr/bin/env python
import sys

for index,line in enumerate(sys.stdin,1):
    print str(index) + ' & ' + line.strip()

Работает точно так же:

$ ./line_counter.py  < input.txt                                                                                         
1 & What & South Dragon & North Dragon    & 5 \\ \hline
2 & What & South Dragon & North Dragon    & 5 \\ \hline
3 & What & South Dragon & North Dragon    & 5 \\ \hline

Но если вы предпочитаете делать это в bash, то это тоже можно сделать:

$ counter=1; while read line ; do printf "%s & %s\n" "$counter" "$line" ; counter=$(($counter+1)) ; done < input.txt
1 & What & South Dragon & North Dragon    & 5 \ hline
2 & What & South Dragon & North Dragon    & 5 \ hline
3 & What & South Dragon & North Dragon    & 5 \ hline
1
13.04.2017, 15:13
1 ответ

Замена -delete на -print (по умолчанию) и конвейер в параллельном GNU должны в основном сделать это:

find . -name '*.in' -type f | parallel rm --

Это запустит одно задание на ядро; используйте -j N , чтобы использовать вместо этого N параллельных заданий .

Не совсем очевидно, что это будет работать намного быстрее, чем последовательное удаление, поскольку удаление, вероятно, требует больше операций ввода-вывода, чем ЦП, но было бы интересно проверить .

(Я сказал «в основном это делаю», потому что эти две команды не полностью эквивалентны; например, параллельная версия не будет делать правильных действий, если некоторые из ваших входных путей включают символы новой строки.)

3
27.01.2020, 23:25

Теги

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