Removendo uma árvore [fechada]

2

CODE EDIT

Então, agora que estou fora do trabalho, posso fazer uma pequena codificação no meu tempo livre. A maneira que eu acho que eu quero que isso funcione é tomar um tarball (o que eu normalmente extrairia para uma pasta de qualquer maneira) e comparar isso com o nosso diretório de trabalho. Então ....

Consegui remover os diretórios de nível superior contando o tamanho da string e subtraindo isso do meu comprimento de eco !! Baby passos 0 =)

#!/bin/bash

#  is the file to test
#  is the base folder

# minus the length of the top level directories and slashes
len='expr length ""'-2

for file in $( tar --list -f  | perl -pe'chomp;$_=qq["''$_" ]' )
do
  # work around bash deficiency
  if [[ -e "$( perl -eprint$file )" ]]
    then
     # do nothing, we need a file doesn't exist flag =(
     echo '';
    else
      echo 'rm -f ${file:len:-1}' # remove dir length and quotes
  fiy
done



$ ./stree mot-add.tar.gz mot/

    [output]
        # this blank space is left from removing top level directory
    server/
    server/artwork/
    server/artwork/erase-me2.jpg
    server/artwork/erase-me1.jpg
    server/artwork/erase-me3.jpg
    server/erase-me.nfo
    erase-me.log
    erase-me/
    client/
    client/dependancies/
    client/dependancies/erase-me.func.php
    client/erase-me.phtml

Ainda estou exibindo diretórios que não deveriam estar lá. = (

remover cotações foi corrigido com echo ${file:len:-1} , mas deixa novas linhas para o diretório de nível superior

END CODE EDIT

Então, estou pensando que, como os diretórios agora existem em dois lugares, o será exibido ou não, independentemente. Seria melhor ideia:

  1. Use o programa em um switch para adicionar / remover
  2. Ao adicionar, crie uma imagem da estrutura do diretório para instalar em $ tar cf dirs.tar --no-recursion --files-from <( find . -type d )
  3. adicione-o ao tar da instalação
  4. usar mais tarde talvez, como um arquivo diff para os diretórios?

Eu não sei, opiniões?

Parece também que o meu script PERL não é realmente compatível por algum motivo, alguém tem uma ideia? Depois de executar um teste de apagar eu tenho isso.

$ tree mot
mot
├── client
│   ├── dependancies
│   │   ├── err_config.ini.php
│   │   ├── modernizr.custom.97882.js
│   │   ├── properCountry.js
│   │   └── sender.php
│   └── index.php
└── server
    ├── artwork
    │   ├── cert01.jpg
    │   ├── cert02.jpg
    │   ├── cert03.jpg
    │   ├── cert04.jpg
    │   ├── cert05.jpg
    │   ├── cert06.jpg
    │   └── gdincludes
    │       ├── overlay.png
    │       └── renaissance.ttf
    ├── cache
    ├── dependancies
    │   ├── cert05.jpg
    │   ├── crypt.func.php
    │   ├── err_config.ini.php
    │   ├── gdimageprocess.func.php
    │   └── pdo.func.php
    ├── erase-me.log
    ├── listener.log
    └── receiver.php

7 directories, 21 files

$ ./stree mot-add.tar.gz mot/
mot/
mot/server/
mot/server/artwork/
mot/server/artwork/erase-me2.jpg
mot/server/artwork/erase-me1.jpg
mot/server/artwork/erase-me3.jpg
mot/server/erase-me.nfo
mot/erase-me.log
mot/erase-me/
mot/client/
mot/client/dependancies/
mot/client/dependancies/erase-me.func.php
mot/client/erase-me.phtml

Antigo

isso é um pouco conceitual, então vou explicar da melhor maneira possível.

Eu tenho uma cópia dos arquivos que eu coloquei em um diretório, eu gostaria de usar isso esqueleto da nossa cópia para remover todos os arquivos que combinam em nosso servidor. Seria tem que ser capaz de saber se existem outros arquivos ou diretórios que não são parte dessa árvore e deixá-los. Então vamos fazer um exemplo bem rápido, apenas em caso eu não esteja sendo muito claro.

Aqui estava a estrutura original

$ tree mot-origional
mot-origional
├── client
│   ├── dependancies
│   │   ├── err_config.ini.php
│   │   ├── modernizr.custom.97882.js
│   │   ├── properCountry.js
│   │   └── sender.php
│   └── index.php
└── server
    ├── artwork
    │   ├── cert01.jpg
    │   ├── cert02.jpg
    │   ├── cert03.jpg
    │   ├── cert04.jpg
    │   ├── cert05.jpg
    │   ├── cert06.jpg
    │   └── gdincludes
    │       ├── overlay.png
    │       └── renaissance.ttf
    ├── cache
    ├── dependancies
    │   ├── crypt.func.php
    │   ├── err_config.ini.php
    │   ├── gdimageprocess.func.php
    │   └── pdo.func.php
    ├── listener.log
    └── receiver.php

7 directories, 20 files

Veja o que foi adicionado

$ tree add-to-mot
add-to-mot/
├── client
│   ├── dependancies
│   │   └── erase-me.func.php
│   └── erase-me.phtml
├── erase-me.log
└── server
    ├── artwork
    │   ├── erase-me1.jpg
    │   ├── erase-me2.jpg
    │   └── erase-me3.jpg
    └── erase-me.nfo

4 directories, 7 files

Então o combinado ficaria assim

$ tree mot
mot
├── client
│   ├── dependancies
│   │   ├── erase-me.func.php
│   │   ├── err_config.ini.php
│   │   ├── modernizr.custom.97882.js
│   │   ├── properCountry.js
│   │   └── sender.php
│   ├── erase-me.phtml
│   └── index.php
├── erase-me.log
└── server
    ├── artwork
    │   ├── cert01.jpg
    │   ├── cert02.jpg
    │   ├── cert03.jpg
    │   ├── cert04.jpg
    │   ├── cert05.jpg
    │   ├── cert06.jpg
    │   ├── erase-me1.jpg
    │   ├── erase-me2.jpg
    │   ├── erase-me3.jpg
    │   └── gdincludes
    │       ├── overlay.png
    │       └── renaissance.ttf
    ├── cache
    ├── dependancies
    │   ├── cert05.jpg
    │   ├── crypt.func.php
    │   ├── err_config.ini.php
    │   ├── gdimageprocess.func.php
    │   └── pdo.func.php
    ├── erase-me.nfo
    ├── listener.log
    └── receiver.php

7 directories, 27 files

Então eu mantenho um diretório preenchido como add-to-mot / sempre para fins de backup, mas eu gostaria de tentar pegar a saída de uma árvore, por exemplo ...

[output]
add-to-mot
client
dependancies
erase-me.func.php
erase-me.phtml
erase-me.log
server
artwork
erase-me1.jpg
erase-me2.jpg
erase-me3.jpg
erase-me.nfo

$ tree -i add-to-mot -o rm-file.nfo
$ cat rm-file.nfo | rm -rf mot/*

Ou algo parecido com o acima, em que canalizo a saída de uma árvore de diretórios para uma instrução remove para uma árvore de diretórios diferente. Isso faz sentido? eu pensei seria um interessante "Como eu faria?" questão. Eu não estou averso a escrever um script bash para fazer isso, não necessariamente tem que ser um forro.

Isso acima excluirá sem prejuízo, porém, eu gostaria de poder sense de outros arquivos e diretórios, e não excluir à toa. Ei, pode ser legal até criar um backup (mot-treetrim.tar.gz) até que eu possa verificar que não tenho massa apagada arquivos / pastas importantes.

Muito obrigado pessoal!

    
por ehime 18.04.2012 / 18:49

1 resposta

0

Eu penso em algo assim:

for h in 'tree -i -f add-to-mot | sed s/add-to-mot/mot/'; do rm -f $h; done

Assim, você apenas lista arquivos com caminhos, substitui add-to-mot por mot in path e remove arquivos. Não funcionará com arquivos com espaços em seus nomes:)

    
por Gall 18.04.2012 / 21:11