criando diretorios em massa

Iniciado por marcospinho, 13 de Julho de 2009, 11:36

tópico anterior - próximo tópico

marcospinho

Esse dias tive uma ideia: decidi reproduzir no meu pendrive a estrutura de diretorios da partição de dados do meu computador, estava procurando um script que criasse as cerca de 800 pastas e subpastas vazias ou com uma imagem de exibição "para o windows - é que eu prezo muito o recurso de exibir uma capa na frente da pasta a partir de um arquvo .jpg que fica na pasta e que tem sempre o nome de 'folder' e se possível incuir esse recurso no nautilus". Eu ja consegui o comando que lista todas as pastas e as poe em um arquivo de texto, mas tentei colocar essa lista na frente de um 'mkdir' dentro do terminal e nada aconteceu. um dos problemas é o uso de espaços nos nomes das pastas: a minha pasta de musica e toda assim por causa do AMAROC, que se não fosse por isso estava dando um show de bola na minha coleção de musicas que ja passa das 12000, quase tudo em mp3. È possível um script que faça esse trabalho? Sendo possível, ele seria dificil? Quais comandos estariam envolvidos nesse script? Eu tinha a intenção de fazer uma pasta zipada com essa árvore para usar sempre que tivesse um novo dispositivo de armazenagem. Eu já descobri um script que transfere todo o conteudo do meu pendrive para a minha partição de dados, agora falta um sistema de alocação de arquivos coerente com o meu modo de organização. Espero que essa minha idéia mobilize alguns colegas do forum para a produção desse script.
celeron 2.66Ghz, 1G Ram, DVDrw monitor AOC 17pol, HDsata500g, L-Ubuntu Maverick-i386, /root 20G /home 50G /win 40G /win7 50G /dados 20G /teste(nathy+Kde) 15G /acervo 220G  Linux Counter #478143. Ubuntu counter is # 24448

Joseph


marcospinho

boa tentativa irmão
CitarInserir Citação
o gooooooooooooogle resolve:

http://www.vivaolinux.com.br/dica/Criando-pastas-em-massa-rapidamente-no-Linux
mas o que eu propus foi uma árvore complexa com diretórios e subdiretórios em profundidade de ate  8 pastas
esse script leria a tabela de arquivos da partição e faria uma cópia de todas as pasta e, de preferencia, copiaria também os arquivos folder.jpg de cada pasta.
Sacou?
celeron 2.66Ghz, 1G Ram, DVDrw monitor AOC 17pol, HDsata500g, L-Ubuntu Maverick-i386, /root 20G /home 50G /win 40G /win7 50G /dados 20G /teste(nathy+Kde) 15G /acervo 220G  Linux Counter #478143. Ubuntu counter is # 24448

Joseph

entendi, requer conhecimentos mais avançados.

raidicar

#4
CitarÈ possível um script que faça esse trabalho? Sendo possível, ele seria dificil? Quais comandos estariam envolvidos nesse script? Eu tinha a intenção de fazer uma pasta zipada com essa árvore para usar sempre que tivesse um novo dispositivo de armazenagem. Eu já descobri um script que transfere todo o conteudo do meu pendrive para a minha partição de dados, agora falta um sistema de alocação de arquivos coerente com o meu modo de organização. Espero que essa minha idéia mobilize alguns colegas do forum para a produção desse script.
É possível e tão simples que você vai se assustar, não creio que sejá necessário criar um zip devido a fácilidade de criar o que precisa.

Postei a um tempo um script que faz backup automatico no pendrive ao pluga-lo no micro mantendo a estrutura de diretorios e na resposta de um colega eu mostrei como fazer o inverso, Acho que é dele que estava falando:
http://ubuntuforum-br.org/index.php/topic,51629.0.html
Pode interagir esse script com o do backup.

Voltando ao problema, deixa eu ver se entendi:
Supondo que eu deseje recriar a estrutura de diretórios a partir de /home/raidicar/Melodias em um pendrive.
Essas pastas no pendrive devem estar vazias.
Supondo que meu pendrive esteja em /media/pendrive
Supondo que eu deseje jogar o arquivo logo.png que eu tenho na minha pasta home dentro de cada pasta e subpasta da estrutura criada no pendrive.
Se for isso, é bem simples, eu faria o seguinte:

#!/bin/bash
cd /home/raidicar/
find Melodias/ -type d -exec mkdir -p /media/pendrive/{} \;
find /media/pendrive/Melodias -type d -exec cp /home/raidicar/logo.png {} \;

Simples né, nem assusta. Não precisa se preocupar com os espaços.
Eu acho que nem criaria um script pra isso, apenas daria o comando no terminal, mas seja como for, ta ai sua solução.

Acho que não precisa de explicação, mas vamos lá.
A saida do comando find /home/raidicar/Imagens/ -type d no meu micro é:
/home/raidicar/Imagens/
/home/raidicar/Imagens/logos
/home/raidicar/Imagens/1280x1024
/home/raidicar/Imagens/ubuntu wallpapers
/home/raidicar/Imagens/1440x900


No script, os simbolos {} recebe automaticamente a saida do comando find.
find /home/raidicar/Imagens/ -type d -exec mkdir -p /media/pendrive/{} \; Esse comando da como saida:
mkdir -p /media/pendrive/home/raidicar/Imagens
mkdir -p /media/pendrive/home/raidicar/Imagens/logos
mkdir -p /media/pendrive/home/raidicar/Imagens/1280x1024
mkdir -p /media/pendrive/home/raidicar/Imagens/1280x1024
mkdir -p /media/pendrive/home/raidicar/Imagens/ubuntu wallpapers

O mkdir é executado para cada resultado encontrado pelo find.
Mas veja que a estrutura de diretórios não começou de Imagens e sim de /home (/media/pendrive/home/raidicar/Imagens).
Isso ocorreu por que o find começou do /home.
Por isso o script começa com o comando cd /home/raidicar.
Se não entrarmos no diretório anterior ao inicio da estrutura que desejamos criar, não obtemos o resultado desejado.
cd /home/raidicar
find Imagens/ -type d -exec mkdir -p /media/pendrive/{} \
A saida desse comando agora é é:
mkdir -p /media/pendrive/Imagens
mkdir -p /media/pendrive/Imagens/logos
mkdir -p /media/pendrive/Imagens/1280x1024
mkdir -p /media/pendrive/Imagens/1280x1024
mkdir -p /media/pendrive/Imagens/ubuntu wallpapers

Assim foi evitado de criar os diretórios /home/raidicar dentro do pendrive.

Seguindo a lógica, a segunda linha do script tem como saida os diretórios do pendrive
find /media/pendrive/Melodias -type d -exec cp /home/raidicar/logo.png {} \;
A saida é:
cp /home/raidicar/logo.png /media/pendrive/Melodias (e todos os subdiretórios)

Certo? Se é isso, tá resolvido, põe 25 centavos na conta do titio, deposita no bradesco que no itau tá negativo.
se não é isso, então não entendi, da mais detalhes.

Abraço!
Quem ama extremamente, deixa de viver em si e vive no que ama. Na vida três coisas são certas, o amor, a morte e o Linux !
Se Platão disse, então realmente sofremos de uma perigosa doença mental.

raidicar

Só finalizando, se o arquivo de imagem que deseja copiar das pastas que estão no micro para as pastas criadas no pendrive forem diferentes entre si, ou seja, cada pasta tem um folder.jpg próprio, o script seria:

#!/bin/bash
cd /home/raidicar/
find Melodias/ -type d -exec mkdir -p /media/pendrive/{} \;
find Melodias/ -name folder.jpg -type f -exec cp {} /media/pendrive/{} \;


Dessa forma, além de criar a pasta, cada pasta manteria o seu arquivo folder.jpg.

Lembre-se que linux é case sensitive, folder.jpg é diferente de Folder.jpg, então, talves seria melhor usar *.jpg ou *older.jpg
Quem ama extremamente, deixa de viver em si e vive no que ama. Na vida três coisas são certas, o amor, a morte e o Linux !
Se Platão disse, então realmente sofremos de uma perigosa doença mental.

marcospinho

De genio essa.
vou testar quando chegar em casa mas se eu usar *.jpg não vai rolar porque eu tenho uma pasta com 3GB de *.jpg e o pendrive so tem IGB. Vou postar aqui hoje á noite o resultado da sua sugestão espero que algum colega também se interese por isso, essa e uma maneira de manter algum controle sobre o que entra no HD e evita o a perda de informação.
Valeu.
celeron 2.66Ghz, 1G Ram, DVDrw monitor AOC 17pol, HDsata500g, L-Ubuntu Maverick-i386, /root 20G /home 50G /win 40G /win7 50G /dados 20G /teste(nathy+Kde) 15G /acervo 220G  Linux Counter #478143. Ubuntu counter is # 24448

marcospinho

um problema: o comando criou as pasta mas não no diretorio que eu queria: direto no /media/MARCOS, mas em  /media/Marcos/dados/ ou seja ele criou uma copia do diretório no diretório de destino
parece que houve um problema na hora de criar as folder.jpg não vi os arquivos onde deveriam estar
os diretorios que eu queria deixar iguais pelo menos nas pastas são:
/media/MARCOS - pendrive de 1 GB e
/media/dados/ - partição do computador de 26 GB
celeron 2.66Ghz, 1G Ram, DVDrw monitor AOC 17pol, HDsata500g, L-Ubuntu Maverick-i386, /root 20G /home 50G /win 40G /win7 50G /dados 20G /teste(nathy+Kde) 15G /acervo 220G  Linux Counter #478143. Ubuntu counter is # 24448

raidicar

#8
Citaro comando criou as pasta mas não no diretorio que eu queria: direto no /media/MARCOS, mas em  /media/Marcos/dados/ ou seja ele criou uma copia do diretório no diretório de destino
Amigo, isso não me parece problema, me parece que esta se perdendo na sua estrutura de diretorios.
Vou tentar ser mais claro, tentar facilitar mais, por que você deu uma emperrada em algo que em nada tem a ver com o script, deu uma emperrada em um problema  que nem diria que é de iniciante, mas de aspirante a aspirante de iniciante. Acredito que tenha sido falta de atenção, mas se não foi, para tudo que cedo ou tarde vai cometer um erro banal e grave, como remover a pasta /usr/bin.

Vamos supor que a origem dos dados é /home/dados, ok?

Se você NÃO quer os dados direto no /media/MARCOS, mas em  /media/Marcos/dados/, o comando tem de ser dado fora da pasta dados.
Se você QUER os dados direto no /media/MARCOS, o comando tem de ser dado dentro da pasta Dados com uma leve e óbvia alteração.
Essa pequena alteração é muito óbvia, nem precisa ser citada pois apenas o conhecimento básico do básico de manipulação de arquivos é necessário (comandos cd, cp, mv...).
Se você não enxergou esse detalhe então ta seguindo a linha errada, tem de saber isso antes de querer criar um script, tem de saber se é necessário entrar ou não em um diretório, afinal, se você deu o comando find Dados... na pasta home, e a pasta Dados (Que existe dentro de home) foi criada no destino, para criar as pastas que estão dentro de Dados no destino sem criar a pasta Dados, basta entrar dentro da pasta Dados e dar o comando find... dentro dela. Mas como dentro da pasta Dados existem vários diretórios, para especificar todos os diretórios dentro dela, altere o inicio do comando de find Dados - para find . -[/color].
Por exemplo, se der um comando como o cp -r Dados /destino a pasta dados será criada no destino. Se quer o conteúdo da pasta Dados, nesse caso, dentre várias as opções possiveis, a opção que se encaixa como uma luva a esse caso é entrar dentro da pasta dados (cd Dados) e dentro da pasta Dados, para copiar seus diretórios para um um destino qualquer o comando seria cp -r . /destino ou cp -r * /destino. É essa a logica necessária ao seu problema.
Como não sei sua estrutura, posso apenas dar o comando e a lógica, vc deve adaptá-lo a sua necessidade. Se você falhar na adaptação, é por que não sabe exatamente o que está fazendo. É muito perigoso desenvolver algo e chegar a um resultado final desconhecendo todos os processos, é um erro brutal.

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Explicando mais detalhadamente por que a pasta Dados foi criada em /media/Marcos
Não sei onde está a pasta dados, então, supondo que estejá em /home/dados, o comande deverá ser rodado dentro da pasta home, uma pasta antes de Dados.
cd /home
find Dados/ -type d -exec mkdir -p /media/Marcos/{} \;

traduzindo: Recriando o diretório Dados e seus subdiretórios em /media/Marcos/
Dessa forma a estrutura do pendrive a ser criada será /media/Marcos/Dados.
Agora sem saber sua estrutura de diretórios fica dificil advinhar, pois não sei nem se essa pasta Dados existe.
Após recriar as pastas, para transferir as imagens o comando seria:
cd /home
find Dados/ -name folder.jpg -type f -exec cp {} /media/Marcos/{} \;

Então, para isso funcionar, as condições seriam:
A pasta que tem meus os dados se chama Dados e está dentro de /home. (/home/Dados).
Tenho um pendrive que esta montado dentro da pasta /media em um diretório com o nome de Marcos. (/media/Marcos)
Para mandar a pasta Dados suas subpastas, cada uma com seu folder.jpg, os comandos seriam:
cd /home
find Dados/ -type d -exec mkdir -p /media/Marcos/{} \;
find Dados/ -name folder.jpg -type f -exec cp {} /media/Marcos/{} \;


Eu acabei de fazer um teste com a minha pasta Imagens, jogando-a dentro da pasta recém criada com o comando: mkdir /home/raidicar/teste.
Criada essa pasta de teste para realizar o teste, dei os comandos:
cd /home/raidicar
find Imagens/ -type d -exec mkdir -p /home/raidicar/teste/{} \;
find Imagens/ -name *.jpg -type f -exec cp {} /home/raidicar/teste/{} \;

Dentro da pasta teste foi criada a pasta imagem com seus subdiretórios e apenas as imagens .jpg foram transferidas as suas respectivas pastas. As imagens png, gif, etc não foram transferidas.
O resultado do comando find teste -type d dado dentro de /home/raidicar mostra minha estrutura de diretórios recém criados na pasta teste:
teste/Imagens
teste/Imagens/logos
teste/Imagens/1280x1024
teste/Imagens/ubuntu wallpapers
teste/Imagens/1440x900

Vê que foi criada a pasta imagens dentro de teste e as subpastas estão no local correto? Assim como foi criado a pasta Dados dentro de /media/Marcos/
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

==========================================================================================
AGORA A PASTA IMAGENS NÃO SERÁ CRIADA, seguindo a mesma lógica, sua pasta Dados também não será criada.
Agora jogo o conteudo da pasta Imagens na raiz da pasta teste, os comandos são:
cd /home/raidicar/Imagens (Vê a diferença aqui, acesse a pasta)
find . -type d -exec mkdir -p /home/raidicar/teste/{} \;
(Vê a pequena difereça no inicio do comando, não especifico uma pasta, especifico o conteudo dessa pasta)
Traduzindo: recriar os diretórios da pasta atual em /home/raidicar/testes/
find . -name *.jpg -type f -exec cp {} /home/raidicar/teste/{} \; (Novamente, como explicado acima. Agora estou trabalnando com as imagens)
Dessa forma o que seria criado na pasta teste seriam os diretórios dentro de Imagens e não a pasta Imagem.
Agora acesso a minha pasta de usuário com o comando cd /home/raidicar e dou novamente o comando find teste -type d.
O resultado é:
teste
teste/logos
teste/1280x1024
teste/ubuntu wallpapers
teste/1440x900
Como dei o find + mkdir dentro da pasta Imagens, a mesma não foi criada, a estrutura foi criada a partir do seu conteúdo.

Para obter esse resultado o seu script seria com os comandos:
cd /home/Dados
find . -type d -exec mkdir -p /media/Marcos/{} \;
find . -name folder.jpg -type f -exec cp {} /media/Marcos/{} \;

O caminho /home/Dados é um exemplo. Agora não foi criada a pasta Dados dentro de /media/Marcos, mas sim, criado as pastas que estão dentro de Dados em /media/Marcos.
=============================================================================================

Bom, é isso, os comandos funcionam, precisa saber como utiliza-los. Se algo não está saindo do jeito desejado é por que não está aplicando direito ou é por que ainda não "pegou" a lógica ou esta se perdendo na sua estrutura de diretórios. Então, se ainda tiver problemas, esqueça de tudo isso , dê uma reforçada em manipulação de arquivos e pastas e tente fazer isso funcionar depois, pois o problema está ai.

Abraço.
Quem ama extremamente, deixa de viver em si e vive no que ama. Na vida três coisas são certas, o amor, a morte e o Linux !
Se Platão disse, então realmente sofremos de uma perigosa doença mental.

marcospinho

acho que ja saquei o negócio, mas a pasta dados esta em /media, não esta em /home. trata-se de uma partição de 26 GB que eu uso para compartilhar com os outros 6 usuários do sistema e com o rwindows
Citaros diretorios que eu queria deixar iguais pelo menos nas pastas são:
/media/MARCOS - pendrive de 1 GB e
/media/dados/ - partição do computador de 26 GB
e o comando foi dado a partir da minha pasta home - /home/marcos/ , foi por isso que o script copiou a pasta /dados junto com as outras dentro do destino e sobre as capas, o que ocorreu é que algumas não tinham ainda o nome de folder.jpg.
A maquina não faz o que a gente quer, faz o que a gente manda fazer, e isso pode até ser um grande problema.
celeron 2.66Ghz, 1G Ram, DVDrw monitor AOC 17pol, HDsata500g, L-Ubuntu Maverick-i386, /root 20G /home 50G /win 40G /win7 50G /dados 20G /teste(nathy+Kde) 15G /acervo 220G  Linux Counter #478143. Ubuntu counter is # 24448

raidicar

Citação de: marcospinho online 17 de Julho de 2009, 14:26
A maquina não faz o que a gente quer, faz o que a gente manda fazer, e isso pode até ser um grande problema.
Vixi maria da poligardinha, isso não é problema não, o dia que a máquina deixar de fazer o que a gente manda, o mundo será uma mistura de matrix com exterminador do futuro! ;D
Agora com relação co script, pra sacar mesmo precisa pesquisar seus comandos para entender mesmo como funciona a coisa, o comando find é de extrema importancia para se mexer com shellscript. Um comando pode dar dezenas de soluções diferentes para os mais diversos problemas.

Abraço.
Quem ama extremamente, deixa de viver em si e vive no que ama. Na vida três coisas são certas, o amor, a morte e o Linux !
Se Platão disse, então realmente sofremos de uma perigosa doença mental.

marcospinho

tomei duas decisões: uma e estudar os comandos e outra e tentar conhecer as opções de gui oferecidas pelo sistema, eu fui no "adicionar e remover" e digitei "sync" e encontrei umas 3 opções, vou ver no que dá.
celeron 2.66Ghz, 1G Ram, DVDrw monitor AOC 17pol, HDsata500g, L-Ubuntu Maverick-i386, /root 20G /home 50G /win 40G /win7 50G /dados 20G /teste(nathy+Kde) 15G /acervo 220G  Linux Counter #478143. Ubuntu counter is # 24448