[
] Так как мне это снова понадобилось, я собрал Perl скрипт, который это делает; он оказался несколько сложным, поэтому я выпустил его здесь:[
] [
] [
] Что он делает, так это анализирует вывод из []-дерева [
] - но, в отличие от примера OP, ему также нужна опция []--dirsfirst[
]. Чтобы не забывать обо всем этом, сначала можно использовать []revrs-tree.pl[
]:[
] [
perl revrs-tree.pl --getdir /usr/include/boost/accumulators/ > test.tree
] [
]... который просто вызовет дерево []-dirsfirst[
] с правильными опциями, которые выводят в stdout - мы перехватываем это в файле []-теста. tree[
].[
] [
] Затем, мы вызываем тот же самый скрипт на этом [] test.tree[
] содержимом; но хитрость в том, что вывод не сами каталоги/файлы - а строки в скрипте [] bash[
], вместо этого, распечатанные в stdout. Вызов выглядит так:[
] [
perl revrs-tree.pl --zerofill test.tree > test-tree.sh
# alternatively, can receive tree text from stdin:
cat test.tree | perl revrs-tree.pl --zerofill > test-tree.sh
] [
]... и []test-tree.sh[
] затем содержит такие вещи как:[
] [
RTD="/usr/include/boost/accumulators";
read -p "WARNING! will output in '$RTD' directory!
Press [Enter] key to start output...";
if [ ! -d "$RTD" ] ; then mkdir "$RTD" ; fi ;
TDIR="$RTD/framework";
mkdir "$TDIR"; sudo chown root:root "$TDIR"; sudo chmod 755 "$TDIR"; sudo touch -d 'Jul 16 2014 9:43:00' "$TDIR";
TDIR="$RTD/framework/accumulators";
mkdir "$TDIR"; sudo chown root:root "$TDIR"; sudo chmod 755 "$TDIR"; sudo touch -d 'Jul 16 2014 9:43:00' "$TDIR";
TFIL="$RTD/framework/accumulators/droppable_accumulator.hpp";
cat /dev/zero | head --bytes 9740 > "$TFIL";
touch -d 'Oct 21 2010 0:00:00' "$TFIL"; sudo chown root:root "$TFIL"; sudo chmod 644 "$TFIL";
...
] [
]Хитрость в том, что:[
] [
]RTD[
] перед запуском скрипта - я этого ни разу не делал, и мне удалось перезаписать []/usr/include/boost/accumulators[
] файлами с нулевым наполнением! (для чего потребовалось []sudo apt-get удалить --purge libboost1.42-dev && sudo apt-get установить libboost1.42-dev[
] для меня) !!!! (поэтому при запуске скрипт будет ждать пользовательского ввода) ... Допустим, здесь вы изменили его на []/tmp/newtarget[
].[]tree[
] не дает полных временных меток - так что времена обычно устанавливаются в 0[]tree[
], а также усекает uids/gids до каких-то 7 или 8 символов - так что, если у вас больше, чем у них, посмотрите на []. sh[
], и при необходимости замените его.[] [
] Затем, так как случилось, что примером OP был каталог, принадлежащий [] root[
], []. sh[
] скрипт содержит []sudo[
] в соответствующих местах, так что вы можете также называть его как суперпользователь: [
] [
sudo bash test-tree.sh
] [
] После множества распечаток [] set -x[
], скрипт должен закончиться; затем вы можете проверить, правильно ли реконструирована структура дерева каталогов/файлов, скажем, []diff[
] - или []meld[
]:[
] [
meld <(tree -spugD /tmp/newtarget/) <(tree -spugD /usr/include/boost/accumulators/)
] [
] Это не дает мне никакой разницы в выводе [] tree[
] (для данного примера), кроме корневого каталога. [
]
В общем, следует использовать инструмент, который понимает html. Однако для ограниченных целей может быть достаточно простой команды. В этом случае sed
достаточно, чтобы делать то, что вы просите, и он хорошо работает в сценариях bash
. Если вы захватили исходный HTML-код в index.html
, то:
$ sed -n 's/.*<p><p tabindex="0">\([^<]*\).*/\1/p' index.html
Clementine is a multiplatform music player focusing on a fast and easy-to-use interface for searching and playing your music.
Или, чтобы захватить HTML-код и обработать его за один шаг:
$ wget -q https://apps.ubuntu.com/cat/applications/clementine/ -O - | sed -n 's/.*<p><p tabindex="0">\([^<]*\).*/\1/p'
Clementine is a multiplatform music player focusing on a fast and easy-to-use interface for searching and playing your music.
Чтобы записать этот вывод в bash
переменная:
output="$(wget -q https://apps.ubuntu.com/cat/applications/clementine/ -O - | sed -n 's/.*<p><p tabindex="0">\([^<]*\).*/\1/p')"
Параметр \ ([^ <] * \). * -n
используется в sed
. Это говорит ему не печатать вывод, если мы явно не попросим. sed
просматривает строку за строкой в поисках строки, соответствующей . *
. Весь текст, следующий за
, и следующий тег фиксируется в переменной 1. Все в этой строке затем заменяется только этим захваченным текстом, который затем печатается.