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:
- Use o programa em um switch para adicionar / remover
- Ao adicionar, crie uma imagem da estrutura do diretório para instalar em
$ tar cf dirs.tar --no-recursion --files-from <( find . -type d )
- adicione-o ao tar da instalação
- 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!