Ok, como eu precisava disso novamente, eu montei um script Perl que faz isso; acabou por ser um pouco complicado, então eu lancei aqui:
O que ele faz é que ele analisa a saída de tree
- mas, ao contrário do exemplo do OP, ele também precisa da opção --dirsfirst
. Para evitar lembrar de tudo isso, o revrs-tree.pl
pode ser usado primeiro assim:
perl revrs-tree.pl --getdir /usr/include/boost/accumulators/ > test.tree
... que simplesmente chamará tree
com as opções corretas, que saem para stdout - nós capturamos isso em um arquivo test.tree
.
Em seguida, chamamos o mesmo script no test.tree
content; mas o truque é que a saída não são os próprios diretórios / arquivos, mas as linhas em um script bash
são impressas no stdout. A chamada é assim:
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
... e test-tree.sh
contém coisas como:
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";
...
O truque aqui é:
- Lembre-se de alterar o
RTD
antes de executar o script - eu não o fiz uma vez e consegui sobrescrever /usr/include/boost/accumulators
com arquivos com preenchimento zero! (que então exigiu sudo apt-get remove --purge libboost1.42-dev && sudo apt-get install libboost1.42-dev
para mim) !!! (é por isso que o script aguardará no início pela entrada do usuário) ... Digamos que aqui você alterou para /tmp/newtarget
.
-
tree
não fornece registros de data e hora completos - portanto, os horários geralmente são definidos como 0
-
tree
também trunca uids / gids para 7 ou 8 caracteres - por isso, se você tiver mais do que isso, inspecione o script .sh
e substitua onde for apropriado.
Então, porque aconteceu que o exemplo do OP foi o diretório root
possuído, o script .sh
contém sudo
nos locais apropriados, então você também pode chamá-lo como superusuário:
sudo bash test-tree.sh
Após muitas impressões de set -x
, o script deve ser concluído. então você pode verificar se a estrutura da árvore de diretórios / arquivos foi reconstruída corretamente com, por exemplo, diff
- ou meld
:
meld <(tree -spugD /tmp/newtarget/) <(tree -spugD /usr/include/boost/accumulators/)
Isso não me dá nenhuma diferença em tree
output (para este exemplo), além do diretório raiz.
Bem, espero que isso ajude alguém ...