Реверс 'дерева' - восстанавливает файл и структуру каталогов от содержания текстового файла?

Хотя bash версия (2.63) autoconf немного стара (сентябрь 2008), она поддерживает --program-transform-name и --program-suffix функции. Печально процесс сборки удара не использует эти функции, как детализировано документацией, и при этом это не использует параметры для разрешения времени изготовления, обрабатывая страниц справочника.

Так как количество файлов и изменений является небольшим, я рекомендую полуручной подход, т.е. пишу маленький сценарий для создания предварительной установки изменений. Можно дополнительно использовать installwatch, чтобы удостовериться, что Вы ловите все во время установки, но bash действительно довольно минимально. (FWIW, у меня были беглый взгляд на порты удара FreeBSD, и патчи удара Debian, никакой знак подходящей фиксации.)

Обычно будучи интересным способом повредить сборки, можно злоупотребить EXEEXT здесь:

ac_cv_exeext=42 ./configure [...]
make
./bash42 -c 'echo $BASH_VERSION'
4.2.42(1)-release

начиная со всего это сохранило Вас, было переименовывание, я действительно не рекомендую это ;-)

Существует немного больше, чтобы быть полученным от:

./configure [...]
make -e Program=bash42

поскольку это также отражает Ваше изменение в сгенерированном bashbug сценарий (хотя это не переименовывает его).

3
05.07.2014, 14:07
2 ответа

Нет такого инструмента, который я когда-либо видел. Вы можете написать скрипт на различных скриптовых языках, включая Bash, чтобы разобрать вывод из дерева и реконструировать соответствующую директорию на диске, которая бы соответствовала ему. Для просмотра текстового файла потребуется цикл , в то время как или для и использование mkdir или mkdiir -p для создания каталога или вложенной структуры каталога, после чего также будет использована команда touch для создания пустых версий файлов в текстовом файле.

Вы даже можете скопировать временные метки, связанные с mkdir и touch, если вы хотите получить структуру полностью скопированную.

.
1
27.01.2020, 21:31
[

] Так как мне это снова понадобилось, я собрал 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[] (для данного примера), кроме корневого каталога. [

]
0
27.01.2020, 21:31

Теги

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