Desafio Nerd [RESOLVIDO]

13. Re: Desafio Nerd [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 24/05/2015 - 19:27h

sheldon escreveu:


Bom,

De inicio, achei que daria para fazer um script com poucas linhas código.
Mas eu fiz um teste aqui e notei que não seria tão fácil, pelo menos da forma que estou pensando.

A ideia inicial é essa seguinte:

-listar arquivos e pastas
-pegar o tamanho dos arquivos e pastas
-jogar tudo em uma matrix
-ordenar os itens da matrix em ordem decrescente
-distribuir os itens da matrix em partes de 4.7G
-mover os arquivos para uma pasta
-mostra na tela o resultado

Então, o que você acha?


A ideia é essa!!! Manda bala... :D




  


14. Re: Desafio Nerd [RESOLVIDO]

Arthur J. Hoch
Arthur_Hoch

(usa FreeBSD)

Enviado em 24/05/2015 - 21:21h


Do with du


15. Re: Desafio Nerd

Arthur J. Hoch
Arthur_Hoch

(usa FreeBSD)

Enviado em 24/05/2015 - 21:52h

Direto na linha de comando:


bash-4.3$ du -lhs `ls`
16K grande
16K grande2
4.0K maiores
4.0K pequeno
4.0K pequeno1
4.0K pequeno2
bash-4.3$ du --exclude=maiores `ls` | awk 'tam=10; { print ($1 > tam) ? system("mv "$2" maiores/") : "false"}'
16 grande
0
16 grande2
0
4 pequeno
false
4 pequeno1
false
4 pequeno2
false
bash-4.3$ ls
maiores pequeno pequeno1 pequeno2
bash-4.3$ cd maiores/
bash-4.3$ ls
grande grande2
bash-4.3$


Script:

#!/bin/bash

##Var

tamanhomin="10";
dir="maiores";

##Script

echo ""

if [ -d $dir ]; then
echo "Não precisa criar diretorio...";
else
echo "Criando diretorio..."
mkdir $dir;
fi

echo ""
echo "Verificando..."
echo ""

du --exclude=$dir --exclude=script.sh `ls` | awk -v tam=$tamanhomin -v dir=$dir '{ print ($1 > tam) ? "Movendo : "$2" Resultado : "system("mv "$2" "dir) : "Arquivo pequeno : "$2}'
echo ""



Você pode colocar os valores manualmente ou por uns readers pra ficar mais "massa".

Deixei bem simples, mas se quiser que eu explique como funciona é só falar.



16. Re: Desafio Nerd

takedown
T4K3D0WN

(usa Ubuntu)

Enviado em 25/05/2015 - 11:57h

vou tentar fazer um ate de noite u.u
por equnato so separa maiores que 4,7 gb '-




foldern="0";
folderprefix="dvd_"
dvdvalue="3850240";
files="$(tac .list.txt)"
mkdir -p arquivos_grandes

function listar(){
echo "">.list1.txt
ls -s *mp4 1>>.list1.txt 2>/dev/null
ls -s *mp3 1>>.list1.txt 2>/dev/null
ls -s *avi 1>>.list1.txt 2>/dev/null
ls -s *flv 1>>.list1.txt 2>/dev/null
ls -s *wmv 1>>.list1.txt 2>/dev/null
ls -s *mkv 1>>.list1.txt 2>/dev/null
ls -s *3gp 1>>.list1.txt 2>/dev/null
ls -s *webm 1>>.list1.txt 2>/dev/null
ls -s *vob 1>>.list1.txt 2>/dev/null

sed '/total/d' .list1.txt 1>/dev/null 2>/dev/null
sed 's/ /:/g' .list1.txt 1>.list.txt 2>/dev/null
}
function more1(){
foldern="$($foldern+1)"
echo $foldern
}
listar



for file in $files
do
temp="$(echo $file|awk -F: '{print $1}')";
selecionado="$(echo $file |cut -c 10-)"

if [ $temp -gt $dvdvalue ]
then
notify-send "o arquivo '$(echo $file|awk -F: '{print $2" "$3" "$4""$5""$6""$7""$8""}')' e grande d+ movendo para pasta separada" --icon=/usr/share/icons/Humanity/apps/64/bash.svg
mv *$(echo $selecionado|sed 's/:/*/g') arquivos_grandes
temp="";
else


fi


done














17. Re: Desafio Nerd [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 25/05/2015 - 12:25h

Hum, vou fazer uns testes aqui e depois digo se os scripts funcionaram.
Valeu!!! ;)



18. Re: Desafio Nerd

Perfil removido
removido

(usa Nenhuma)

Enviado em 25/05/2015 - 13:42h

Deixem-me exemplificar com uma imagem (tabela) para ficar mais fácil de entender o que eu gostaria que o script fizesse:

http://imgur.com/IS2IoC8

Nesta imagem temos um diretório com alguns arquivos de vídeo de tamanhos variados (em MB), ok.
O que o script tem que fazer é combinar os arquivos em matrizes de modo a encontrar a matriz (soma) que melhor se aproxima do valor especificado, no caso o de um DVD 4,7GB (4812MB). No exemplo a matriz 3 foi melhor, então o script separaria estes arquivos (filmes 1, 3, 4, 5, 6 e 9) para serem gravados no DVD.

Não se trata apenas de separar os maiores dos menores, mas fazer a melhor combinação entre eles. Sacaram a jogada!?

;)



19. Re: Desafio Nerd [RESOLVIDO]

takedown
T4K3D0WN

(usa Ubuntu)

Enviado em 25/05/2015 - 17:47h

ta ai mais ele ta com erro '-' as vezes funciona as vezess n ;-;





#!/bin/bash
# -*- coding: utf-8 -*-
#
# script.sh
#
# Copyright 2015 takedown <keneth.handerson@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
#
#

#variaveis
foldern="-1";
diminui="10000";
folderprefix="dvd_";
dvdvalue="3850240";
files="$(tac .list.txt 2>/dev/null)";
temp="";
mkdir -p arquivos_grandes


#listar
function listar(){

echo "">.list1.txt
ls -s *mp4 *mp3 *avi *.ogg *flv *wmv *mkv *3gp *webm *vob 1>>.list1.txt 2>/dev/null
sed '/total/d' .list1.txt 1>/dev/null 2>/dev/null
sed 's/ /:/g' .list1.txt 1>.list.txt 2>/dev/null
}



#adiciona +1 ao nome da pasta
function more1(){
foldern="$( echo $foldern +1 |bc)"; }

#chama a funcao e cria a pasta
function mk(){
more1
mkdir -p $folderprefix$foldern
}


#loop inicial
function loop1(){

resulta="$(cat .list.txt |grep $valuet)";
resultb="$(cat .list.txt |grep $valuet|sed 's/ /:/g'|awk -F: '{print $2" "$3" "$4""$5""$6""$7""$8""}')";

}
function loop2(){
if [ $resulta -lt $valuet ]
then
mv *$(echo $resultb|sed 's/:/*/g') $folderprefix$foldern
else
value2="$(echo $valuet - $diminui |bc)";
valuet=value2;

loop1
loop2
fi
}

listar #chama o listamento





#executa o loop para cada arquivo da lista
for file in $files
do
temp="$(echo $file|awk -F: '{print $1}')";
selecionado="$(echo $file |cut -c 10-)";

if [ $temp -gt $dvdvalue ]
then
#notifica e move arquivos grandes
notify-send "o arquivo '$(echo $file|awk -F: '{print $2" "$3" "$4""$5""$6""$7""$8""}')' e grande d+ movendo para pasta separada" --icon=/usr/share/icons/Humanity/apps/64/bash.svg
mv *$(echo $selecionado|sed 's/:/*/g') arquivos_grandes

else
#cria a pasta e move arquivos para ela
mk
mv *$(echo $selecionado|sed 's/:/*/g') $folderprefix$foldern
value="$(echo $dvdvalue - $temp |bc)";
valuet="$(echo $value |cut -c 1-5)";
#inicia o loop
loop1
loop2
fi
if listar
then
null2="1"
fi
done




20. Re: Desafio Nerd [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 25/05/2015 - 18:27h

T4K3D0WN escreveu:

ta ai mais ele ta com erro '-' as vezes funciona as vezess n ;-;

#!/bin/bash
# -*- coding: utf-8 -*-
#
# script.sh
#
# Copyright 2015 takedown <keneth.handerson@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
#
#

#variaveis
foldern="-1";
diminui="10000";
folderprefix="dvd_";
dvdvalue="3850240";
files="$(tac .list.txt 2>/dev/null)";
temp="";
mkdir -p arquivos_grandes


#listar
function listar(){

echo "">.list1.txt
ls -s *mp4 *mp3 *avi *.ogg *flv *wmv *mkv *3gp *webm *vob 1>>.list1.txt 2>/dev/null
sed '/total/d' .list1.txt 1>/dev/null 2>/dev/null
sed 's/ /:/g' .list1.txt 1>.list.txt 2>/dev/null
}



#adiciona +1 ao nome da pasta
function more1(){
foldern="$( echo $foldern +1 |bc)"; }

#chama a funcao e cria a pasta
function mk(){
more1
mkdir -p $folderprefix$foldern
}


#loop inicial
function loop1(){

resulta="$(cat .list.txt |grep $valuet)";
resultb="$(cat .list.txt |grep $valuet|sed 's/ /:/g'|awk -F: '{print $2" "$3" "$4""$5""$6""$7""$8""}')";

}
function loop2(){
if [ $resulta -lt $valuet ]
then
mv *$(echo $resultb|sed 's/:/*/g') $folderprefix$foldern
else
value2="$(echo $valuet - $diminui |bc)";
valuet=value2;

loop1
loop2
fi
}

listar #chama o listamento





#executa o loop para cada arquivo da lista
for file in $files
do
temp="$(echo $file|awk -F: '{print $1}')";
selecionado="$(echo $file |cut -c 10-)";

if [ $temp -gt $dvdvalue ]
then
#notifica e move arquivos grandes
notify-send "o arquivo '$(echo $file|awk -F: '{print $2" "$3" "$4""$5""$6""$7""$8""}')' e grande d+ movendo para pasta separada" --icon=/usr/share/icons/Humanity/apps/64/bash.svg
mv *$(echo $selecionado|sed 's/:/*/g') arquivos_grandes

else
#cria a pasta e move arquivos para ela
mk
mv *$(echo $selecionado|sed 's/:/*/g') $folderprefix$foldern
value="$(echo $dvdvalue - $temp |bc)";
valuet="$(echo $value |cut -c 1-5)";
#inicia o loop
loop1
loop2
fi
if listar
then
null2="1"
fi
done



Não funfou!!!! :(




21. Re: Desafio Nerd [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 25/05/2015 - 21:40h

sheldon escreveu:


Amigo,

fiz o script,

tentei deixar o código o mais simples possível,
caso você queira adaptar e/ou melhorar o código, fique à vontade.

para usar: ./script.sh "diretório"


#!/bin/bash

label="DVD"
maxsize=5046586572 #B 4.7*1024^3
IFS=$'\n'
dir="$1"
fl=(`ls "$dir"`)
len=${#fl[@]}
n=1
i=0
while [[ $i -lt $len ]]; do
echo "[$label$n]"
#mkdir -p "$dir/$label$n" # criar diretório
tlsize=0

for (( j=0; j<$len; j++ )); do
f="${fl[$j]}"
if [ -n "$f" ]; then
fsize=`du -hsb0 "$dir/$f" | awk '{print $1}'`
if [[ $fsize -ge $maxsize ]]; then
i=$(( i + 1 ))
continue
fi
if [[ $(( $tlsize + $fsize )) -ge $maxsize ]]; then
continue
fi
du -hs "$dir/$f"
#mv "$dir/$f" "$dir/$label$n" # mover arquivo
fl[$j]=""
i=$(( i + 1 ))
tlsize=$(( tlsize + fsize ))
fi
done

echo
echo "Total: "`echo "scale=2; $tlsize/1024^3" | bc`"G"
echo
n=$(( n + 1 ))
done

for (( j=0; j<$len; j++ )); do
if [ -n "${fl[$j]}" ]; then
echo "Erro: Arquivo maior que tamanho maximo"
echo " " `du -hs "$dir/${fl[$j]}"`
fi
done


se quiser que o script mova os arquivos para uma pasta, tipo DVD1, DVD2...
descomentar as linhas 13 e 28 do código.

espero que funcione.
t+


Perfeito!!!
Era isso mesmo que eu queria, valeu!!!!!!
:D




22. Re: Desafio Nerd [RESOLVIDO]

sheldon
sheldon

(usa Debian)

Enviado em 25/05/2015 - 21:44h

PauloHAC escreveu:

sheldon escreveu:


Amigo,

fiz o script,

tentei deixar o código o mais simples possível,
caso você queira adaptar e/ou melhorar o código, fique à vontade.

para usar: ./script.sh "diretório"


#!/bin/bash

label="DVD"
maxsize=5046586572 #B 4.7*1024^3
IFS=$'\n'
dir="$1"
fl=(`ls "$dir"`)
len=${#fl[@]}
n=1
i=0
while [[ $i -lt $len ]]; do
echo "[$label$n]"
#mkdir -p "$dir/$label$n" # criar diretório
tlsize=0

for (( j=0; j<$len; j++ )); do
f="${fl[$j]}"
if [ -n "$f" ]; then
fsize=`du -hsb0 "$dir/$f" | awk '{print $1}'`
if [[ $fsize -ge $maxsize ]]; then
i=$(( i + 1 ))
continue
fi
if [[ $(( $tlsize + $fsize )) -ge $maxsize ]]; then
continue
fi
du -hs "$dir/$f"
#mv "$dir/$f" "$dir/$label$n" # mover arquivo
fl[$j]=""
i=$(( i + 1 ))
tlsize=$(( tlsize + fsize ))
fi
done

echo
echo "Total: "`echo "scale=2; $tlsize/1024^3" | bc`"G"
echo
n=$(( n + 1 ))
done

for (( j=0; j<$len; j++ )); do
if [ -n "${fl[$j]}" ]; then
echo "Erro: Arquivo maior que tamanho maximo"
echo " " `du -hs "$dir/${fl[$j]}"`
fi
done


se quiser que o script mova os arquivos para uma pasta, tipo DVD1, DVD2...
descomentar as linhas 13 e 28 do código.

espero que funcione.
t+


Perfeito!!!
Era isso mesmo que eu queria, valeu!!!!!!
:D



Ok!
que bom que funcionou. :)







01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts