У меня есть папка, в которой около 2 миллионов файлов. Мне нужно выполнить следующие команды:

sed -i 's/<title>/<item><title>/g;s/rel="nofollow"//g;s/<\/a> &bull;/]]><\/wp:meta_value><\/wp:postmeta><content:encoded><![CDATA[/g;s/By <a href="http:\/\/www.website.com\/authors.*itemprop="author">/<wp:postmeta><wp:meta_key><![CDATA[custom_author]]><\/wp:meta_key><wp:meta_value><![CDATA[/g' /home/testing/*

sed -i '$a]]></content:encoded><wp:status><![CDATA[draft]]></wp:status><wp:post_type><![CDATA[post]]></wp:post_type><dc:creator><![CDATA[Database]]></dc:creator></item>\' /home/testing/*

awk -i inplace 1 ORS=' ' /home/testing/*

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

Я бы предпочел, чтобы при открытии каждого файла над ним запускались все 3 команды, а затем переходил к следующему. Надеюсь, это имеет смысл.

0
Edward 10 Апр 2016 в 22:03

1 ответ

Вы можете сделать все в одной команде awk примерно так:

awk -i inplace -v ORS=' ' '{
    gsub(/<title>/,"<item><title>")
    gsub(/rel="nofollow"/,"")
    gsub(/<\/a> &bull;/,"]]><\/wp:meta_value><\/wp:postmeta><content:encoded><![CDATA[")
    gsub(/By <a href="http:\/\/www.website.com\/authors.*itemprop="author">/,"<wp:postmeta><wp:meta_key><![CDATA[custom_author]]><\/wp:meta_key><wp:meta_value><![CDATA[")
    print $0 "]]></content:encoded><wp:status><![CDATA[draft]]></wp:status><wp:post_type><![CDATA[post]]></wp:post_type><dc:creator><![CDATA[Database]]></dc:creator></item>"
}' /home/testing/*

Но это не значит, что это лучший способ делать то, что вы хотите.

Вышеизложенное основано на моей правильной интерпретации того, что делают ваши команды, и, очевидно, не проверено, поскольку вы не предоставили никаких образцов ввода и ожидаемого вывода. Он также по-прежнему полагается на GNU awk для -i inplace, как и ваш исходный сценарий.

1
Ed Morton 10 Апр 2016 в 19:45