передача ls в другие программы по сравнению с подстановкой циклов

Спасибо вам обоим за ответы и спасибо Исааку за комментарии.
Я взял весь ваш код и поместил его в скриптstephen.awkkusa.shи isaac.sh, после чего я провел небольшой тест, подобный этому:

for i in $(ls *.csv)
do
    script.sh $1
done

Командой timeсравниваю и вот результат:

stephen.awk

real    2m35,049s
user    2m26,278s
sys     0m8,495s

stephen.awk:обновлено /IN _OPEN/ перед вторым блоком

real    0m35,749s
user    0m15,711s
sys     0m4,915s

куса.ш

real    8m55,754s
user    8m48,924s
sys     0m21,307s

Обновление с включенным фильтромIN_OPEN:

real    0m37,463s
user    0m9,340s
sys     0m4,778s

Примечание:
Хотя правильно, у меня было много пустых строк, выведенных с помощью sed, ваш скрипт был единственным таким.

isaac.sh

grep -oP '^[^;]*;\K[^;]*' file.csv | sort -u | grep -oP '.*/\K.*' | sort | uniq -d
real    7m2,715s
user    6m56,009s
sys     0m18,385s

С включенным фильтромIN_OPEN:

real    0m32,785s
user    0m8,775s
sys     0m4,202s

мой сценарий

real    6m27,645s
user    6m13,742s
sys     0m20,570s

@Stephen, вы явно выиграли, с очень впечатляющим сокращением времени в 2,5 раза.

Хотя, немного подумав, я пришел к другой идее: что, если я буду смотреть только на событие OPEN file, это уменьшит сложность, и вы не предполагаете получить доступ к файлу или записать его, не открыв его сначала, поэтому я так и сделал. что:

#see I add grep "IN_OPEN" to reduce complexity
PATHLIST=$(grep "IN_OPEN" "${1}" | cut -d';' -f 2 | sort -u)
FILENAMELIST=""
for path in ${PATHLIST}
do
    FILENAMELIST="$(basename "${path}")
${FILENAMELIST}"
done
echo "${FILENAMELIST}" | sort | uniq -d

С этой единственной модификацией, которая дала мне тот же результат, я получаю это timeзначение:

real    0m56,412s
user    0m27,439s
sys     0m9,928s

И я уверен, что есть много других вещей, которые я мог бы сделать

0
16.11.2019, 00:34
1 ответ

Хотя зацикливание глобуса безопаснее, чем передача по конвейеру вывода ls, имейте в виду, что вывод lsнастолько опасен, насколько вы его создаете. Если вы являетесь единственным пользователем системы и разумно относитесь к именованию файлов, то конвейер lsне имеет большого значения. Как упоминается в вашей статье, эти проблемы возникают только тогда, когда вы начинаете добавлять в имена файлов нечетные символы (, символы новой строки, каналы и т. д. ). Я бы действительно беспокоился о безопасной передаче ls только при использовании системы, которая используется большой группой людей или имеет файлы, случайно сгенерированные какой-либо программой. Для общего использования на частном компьютере разумное именование файлов, вероятно, проще, чем написание цикла.

0
28.01.2020, 03:06

Теги

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