Script que identifica e copia os tipos de ficheiros existentes

1. Script que identifica e copia os tipos de ficheiros existentes

Ede
ede_linux

(usa Ubuntu)

Enviado em 26/06/2017 - 06:35h

Olá a todos,

Criei este script, que aproveito e partilho com a comunidade:

#VAR
log=/folder/folder/scripts/log2.c

#script
echo "----------------- Initial Folder ----------------------">>$log
date>>$log
echo "-------------------------------------------------------">>$log
cd /folder/folderfolder
find -type f -exec file -ib {} \; | awk '{count[$1]++}END{for(j in count) print j,"("count[j]" occurences)"}' | sort>>$log
echo "-------------------------------------------------------">>$log
date>>$log


Esse script crie um relatório assim:

----------------- Initial Folder ----------------------
Mon Jun 20 05:46:26 WEST 2017
-------------------------------------------------------
application/CDFV2-unknown; (19 occurences)
application/CDFV2; (38 occurences)
application/gzip; (2538 occurences)
application/java-archive; (24 occurences)
application/msword; (38 occurences)
application/octet-stream; (11969 occurences)
application/pdf; (2561 occurences)
application/postscript; (182 occurences)
application/vnd.fdf; (2 occurences)
application/vnd.iccprofile; (90 occurences)
....


Adoro este script pois dá-me logo uma ideia geral de quantos e que tipos de arquivos é que tenho em determinado directrório. Mas preciso de criar uma nova versão. Preciso que após contagem ele execute as seguintes tarefas:

1-Quais os ficheiros que pretende copiar?
2-Irei digitar o numero referente o tipo de ficheiros, algo assim: 1,6,5
3-Copia todos os tipos de ficheiros que escolhi para um novo directório;

Para que a segunda tarefa seja possível a lista inicial deve sofrer a seguinte alteração:

----------------- Initial Folder ----------------------
Mon Jun 20 05:46:26 WEST 2017
-------------------------------------------------------
1-application/CDFV2-unknown; (19 occurences)
2-application/CDFV2; (38 occurences)
3-application/gzip; (2538 occurences)
4-application/java-archive; (24 occurences)
5-application/msword; (38 occurences)
6-application/octet-stream; (11969 occurences)
7-application/pdf; (2561 occurences)
8-application/postscript; (182 occurences)
9-application/vnd.fdf; (2 occurences)
10-application/vnd.iccprofile; (90 occurences)
....

Acho que sei fazer esta adição de números. O que preocupa é como vou utilizar a mesma para idenficação. (Mas lá está, isso é uma das questões principais deste tópico :)
Portanto, escolhidos os tipos de ficheiros que pretendo copiar, que serão:

1-application/CDFV2-unknown; (19 occurences)
5-application/msword; (38 occurences)
6-application/octet-stream; (11969 occurences)

Pretendo que o script copie todos os ficheiros deste tipo para um directrório em especifico.
Expliquei bem o problema/desafio?

Desde já, Obrigado pela ajuda



  


2. Re: Script que identifica e copia os tipos de ficheiros existentes

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 26/06/2017 - 12:04h

ede_linux escreveu:

Olá a todos,

Criei este script, que aproveito e partilho com a comunidade:

#VAR
log=/folder/folder/scripts/log2.c

#script
echo "----------------- Initial Folder ----------------------">>$log
date>>$log
echo "-------------------------------------------------------">>$log
cd /folder/folderfolder
find -type f -exec file -ib {} \; | awk '{count[$1]++}END{for(j in count) print j,"("count[j]" occurences)"}' | sort>>$log
echo "-------------------------------------------------------">>$log
date>>$log


Esse script crie um relatório assim:

----------------- Initial Folder ----------------------
Mon Jun 20 05:46:26 WEST 2017
-------------------------------------------------------
application/CDFV2-unknown; (19 occurences)
application/CDFV2; (38 occurences)
application/gzip; (2538 occurences)
application/java-archive; (24 occurences)
application/msword; (38 occurences)
application/octet-stream; (11969 occurences)
application/pdf; (2561 occurences)
application/postscript; (182 occurences)
application/vnd.fdf; (2 occurences)
application/vnd.iccprofile; (90 occurences)
....


Adoro este script pois dá-me logo uma ideia geral de quantos e que tipos de arquivos é que tenho em determinado directrório. Mas preciso de criar uma nova versão. Preciso que após contagem ele execute as seguintes tarefas:

1-Quais os ficheiros que pretende copiar?
2-Irei digitar o numero referente o tipo de ficheiros, algo assim: 1,6,5
3-Copia todos os tipos de ficheiros que escolhi para um novo directório;

Para que a segunda tarefa seja possível a lista inicial deve sofrer a seguinte alteração:

----------------- Initial Folder ----------------------
Mon Jun 20 05:46:26 WEST 2017
-------------------------------------------------------
1-application/CDFV2-unknown; (19 occurences)
2-application/CDFV2; (38 occurences)
3-application/gzip; (2538 occurences)
4-application/java-archive; (24 occurences)
5-application/msword; (38 occurences)
6-application/octet-stream; (11969 occurences)
7-application/pdf; (2561 occurences)
8-application/postscript; (182 occurences)
9-application/vnd.fdf; (2 occurences)
10-application/vnd.iccprofile; (90 occurences)
....

Acho que sei fazer esta adição de números. O que preocupa é como vou utilizar a mesma para idenficação. (Mas lá está, isso é uma das questões principais deste tópico :)
Portanto, escolhidos os tipos de ficheiros que pretendo copiar, que serão:

1-application/CDFV2-unknown; (19 occurences)
5-application/msword; (38 occurences)
6-application/octet-stream; (11969 occurences)

Pretendo que o script copie todos os ficheiros deste tipo para um directrório em especifico.
Expliquei bem o problema/desafio?

Desde já, Obrigado pela ajuda


Boa tarde Ede.
Seguem sugestões:
Adiciona o Nº da Linha:
find -type f -exec file -ib {} \;|awk '{count[$1]++}END{for(j in count) print j,"("count[j]" occurences)"}' | awk '{print NR ,$0}' |tee -a $log
#*|tee -a $log => mostra na tela e "guarda no arquivo de log".
# awk '{print NR ,$0}' => Numera as linhas.
OBS: PODE ser usado o "nl" para numerar as linhas.
PEGANDO as LINHAS ESCOLHIDAS:
awk '/^6|^1|^9/ {print $0}' $log

att.:
Marcelo Oliver




3. Re: Script que identifica e copia os tipos de ficheiros existentes

Ede
ede_linux

(usa Ubuntu)

Enviado em 26/06/2017 - 20:09h

A saída deste script:

#VAR
log=/home/xx/xx/xx/xx/log4.c

#script
echo "----------------- Initial Folder ----------------------">>$log
date>>$log
echo "-------------------------------------------------------">>$log
cd /home/xx/xx
find -type f -exec file -ib {} \; | awk '{count[$1]++}END{for(j in count) print j,"("count[j]" occurences)"}' | awk '{print NR , $0}' | tee -a $log
awk '/^6|^1|^9/ {print $0}' $log
echo "-------------------------------------------------------">>$log
date>>$log

È esta:

1 application/octet-stream; (959 occurences)
2 application/x-dosexec; (134 occurences)
3 image/jpeg; (4 occurences)
4 application/winhelp; (11 occurences)
5 application/x-rar; (1 occurences)
6 text/plain; (290 occurences)
7 application/vnd.ms-powerpoint; (1 occurences)
8 application/x-archive; (2 occurences)
9 application/msword; (1 occurences)
10 application/pdf; (6 occurences)
11 image/gif; (17 occurences)
1 application/octet-stream; (959 occurences)
6 text/plain; (290 occurences)
9 application/msword; (1 occurences)

10 application/pdf; (6 occurences)
11 image/gif; (17 occurences)
1 application/octet-stream; (959 occurences)
6 text/plain; (290 occurences)
9 application/msword; (1 occurences)

10 application/pdf; (6 occurences)
11 image/gif; (17 occurences)
1 application/octet-stream; (959 occurences)
6 text/plain; (290 occurences)
9 application/msword; (1 occurences)

10 application/pdf; (6 occurences)
11 image/gif; (17 occurences)
1 application/octet-stream; (959 occurences)
6 text/plain; (290 occurences)
9 application/msword; (1 occurences)

10 application/pdf; (6 occurences)
11 image/gif; (17 occurences)
1 application/octet-stream; (959 occurences)
6 text/plain; (290 occurences)
9 application/msword; (1 occurences)

10 application/pdf; (6 occurences)
11 image/gif; (17 occurences)
1 application/octet-stream; (959 occurences)
6 text/plain; (290 occurences)
9 application/msword; (1 occurences)

10 application/pdf; (6 occurences)
11 image/gif; (17 occurences)
1 application/octet-stream; (959 occurences)
6 text/plain; (290 occurences)
9 application/msword; (1 occurences)

10 application/pdf; (6 occurences)
11 image/gif; (17 occurences)
1 application/octet-stream; (959 occurences)
6 text/plain; (290 occurences)
9 application/msword; (1 occurences)

10 application/pdf; (6 occurences)
11 image/gif; (17 occurences)
1 application/octet-stream; (959 occurences)
6 text/plain; (290 occurences)
9 application/msword; (1 occurences)

10 application/pdf; (6 occurences)
11 image/gif; (17 occurences)
1 application/octet-stream; (959 occurences)
6 text/plain; (290 occurences)
9 application/msword; (1 occurences)

10 application/pdf; (6 occurences)
11 image/gif; (17 occurences)

Após o negrito, aparece 10 vez, repetido, os valores referente aos números 1, 6 e 9. Isso ocorre por causa desta parte do código, certo:

{print $0}' - em (awk '/^6|^1|^9/ {print $0}' $log)


Eu acho que estamos a pegar o valor do caminho no local errado. Porque no programa find, na instrução principal, eu apenas contabilizo, logo não considero os caminhos absolutos. Certo?
Nota: Isto é a opinião de quem não percebe nada em shell script :P :) Ao vosso lado ainda sou um menino! hehe
O ideal/objectivo é pegar o caminho absoluto de todos os ficheiros com os "tipos" escolhidos. Que são:

1-octet-stream
6-ext/plain
9-application/msword

Obrigado



4. Re: Script que identifica e copia os tipos de ficheiros existentes

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 26/06/2017 - 22:04h

ede_linux escreveu:

A saída deste script:

#VAR
log=/home/xx/xx/xx/xx/log4.c

#script
echo "----------------- Initial Folder ----------------------">>$log
date>>$log
echo "-------------------------------------------------------">>$log
cd /home/xx/xx
find -type f -exec file -ib {} \; | awk '{count[$1]++}END{for(j in count) print j,"("count[j]" occurences)"}' | awk '{print NR , $0}' | tee -a $log
awk '/^6|^1|^9/ {print $0}' $log
echo "-------------------------------------------------------">>$log
date>>$log

È esta:

1 application/octet-stream; (959 occurences)
2 application/x-dosexec; (134 occurences)
3 image/jpeg; (4 occurences)
4 application/winhelp; (11 occurences)
5 application/x-rar; (1 occurences)
6 text/plain; (290 occurences)
7 application/vnd.ms-powerpoint; (1 occurences)
8 application/x-archive; (2 occurences)
9 application/msword; (1 occurences)
10 application/pdf; (6 occurences)
11 image/gif; (17 occurences)
1 application/octet-stream; (959 occurences)
6 text/plain; (290 occurences)
9 application/msword; (1 occurences)

10 application/pdf; (6 occurences)
11 image/gif; (17 occurences)
1 application/octet-stream; (959 occurences)
6 text/plain; (290 occurences)
9 application/msword; (1 occurences)

10 application/pdf; (6 occurences)
11 image/gif; (17 occurences)
1 application/octet-stream; (959 occurences)
6 text/plain; (290 occurences)
9 application/msword; (1 occurences)

10 application/pdf; (6 occurences)
11 image/gif; (17 occurences)
1 application/octet-stream; (959 occurences)
6 text/plain; (290 occurences)
9 application/msword; (1 occurences)

10 application/pdf; (6 occurences)
11 image/gif; (17 occurences)
1 application/octet-stream; (959 occurences)
6 text/plain; (290 occurences)
9 application/msword; (1 occurences)

10 application/pdf; (6 occurences)
11 image/gif; (17 occurences)
1 application/octet-stream; (959 occurences)
6 text/plain; (290 occurences)
9 application/msword; (1 occurences)

10 application/pdf; (6 occurences)
11 image/gif; (17 occurences)
1 application/octet-stream; (959 occurences)
6 text/plain; (290 occurences)
9 application/msword; (1 occurences)

10 application/pdf; (6 occurences)
11 image/gif; (17 occurences)
1 application/octet-stream; (959 occurences)
6 text/plain; (290 occurences)
9 application/msword; (1 occurences)

10 application/pdf; (6 occurences)
11 image/gif; (17 occurences)
1 application/octet-stream; (959 occurences)
6 text/plain; (290 occurences)
9 application/msword; (1 occurences)

10 application/pdf; (6 occurences)
11 image/gif; (17 occurences)
1 application/octet-stream; (959 occurences)
6 text/plain; (290 occurences)
9 application/msword; (1 occurences)

10 application/pdf; (6 occurences)
11 image/gif; (17 occurences)

Após o negrito, aparece 10 vez, repetido, os valores referente aos números 1, 6 e 9. Isso ocorre por causa desta parte do código, certo:

{print $0}' - em (awk '/^6|^1|^9/ {print $0}' $log)


Eu acho que estamos a pegar o valor do caminho no local errado.
Porque no programa find, na instrução principal, eu apenas contabilizo, logo não considero os caminhos absolutos. Certo?
Nota: Isto é a opinião de quem não percebe nada em shell script :P :) Ao vosso lado ainda sou um menino! hehe
O ideal/objectivo é pegar o caminho absoluto de todos os ficheiros com os "tipos" escolhidos. Que são:

1-octet-stream
6-ext/plain
9-application/msword

Obrigado


Boa noite, Ede.
Vamos aos pontos.
1 - O comando "awk '/^6|^1|^9/ {print $0}' $log"
Não deve ficar Junto com os comandos que contam os tipos de arquivos . . .
É para ser usado na seguinte situação:
Esses são os "tipos de ARQUIVOS":

1 application/x-xz; (1 occurences)
2 application/gzip; (1 occurences)
3 inode/x-empty; (1 occurences)
4 application/zip; (1 occurences)
5 text/plain; (87 occurences)
6 text/html; (6 occurences)
7 text/x-shellscript; (165 occurences)
8 application/x-sharedlib; (1 occurences)
9 application/vnd.oasis.opendocument.text; (1 occurences)
10 application/pdf; (2 occurences)

read -p " COPIAR quais TIPOS de ARQUIVO: " TIPO
RESPOSTA do USUÁRIO: 1,5,7
TIPO=$(sed -r 's/[0-9]/\^&/g;s/,/|/g' <<< "$TIPO")
Agora, usa aquele comando . . .
awk '/'$TIPO'/ {print $0}' $log
Quanto ao caminho absoluto,
É "perdido" no comando:
awk '{count[$1]++}END{for(j in count) print j,"("count[j]" occurences)"}'
Conforme voce mencionou . . .
Vejo que não tem como "contar" o tipo do arquivo e guardar o caminho . . .
Seu script está muito bom . . .
Tem que desenvolver um modo de copiar pelo tipo ou extensão do arquivo...

att.:
Marcelo Oliver



5. Re: Script que identifica e copia os tipos de ficheiros existentes

Ede
ede_linux

(usa Ubuntu)

Enviado em 27/06/2017 - 05:54h

Compreendi.

Para me organizar decidi dividir as coisas. Para isso criei este script, que aproveito e partilho com a comunidade, que copia todos os ficheiros de determinada extensão que estão num directorio:

#!/bin/bash
# author: linux
# date: 27/06/2017
# version: 1

# Objective:
# Copiar ou mover, depende do comando, todos os ficheiros de um directorio com um tipo de extensao

# Notes:
## Command cp and mv:
# -u: copy only when the SOURCE file is newer than the destination file or when the destination file is missing;
# -i: prompt before overwrite (overrides a previous -n option);

# Variavies
source=/home/xxx/Downloads/
destiny=/home/xxx/Documents/xx/xx/oxxla/

# Code
find $source -name "*.pdf" -exec cp -iu {} -t $destiny \;
#find $source -name "*.pdf" -exec mv -iu {} -t $destiny \;


Agora, julgo eu, apenas tenho que utilizar o comando find mas com o tipo de extensões e não pelo parametro -name!
Para isso posso utilizar os valores que estão na variável TIPO, que é o que guarda os tipos de ficheiros que o user escolheu! Estou certo?

Estou é com dificuldades em configurar o find com a variável TIPO. Ou em primeiro lugar, utilizar o find para copiar ficheiros via o tipo de dados.

Obrigado


6. Re: Script que identifica e copia os tipos de ficheiros existentes

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 27/06/2017 - 17:02h

ede_linux escreveu:

Compreendi.

find $source -name "*.pdf" -exec cp -iu {} -t $destiny \;
#find $source -name "*.pdf" -exec mv -iu {} -t $destiny \;
[/code]

Agora, julgo eu, apenas tenho que utilizar o comando find mas com o tipo de extensões e não pelo parametro -name!
Para isso posso utilizar os valores que estão na variável TIPO, que é o que guarda os tipos de ficheiros que o user escolheu! Estou certo?

Estou é com dificuldades em configurar o find com a variável TIPO.
Ou em primeiro lugar, utilizar o find para copiar ficheiros via o tipo de dados.
Obrigado


Boa tarde Ede.
Para isso posso utilizar os valores que estão na variável TIPO
Não!!!.
Veja o Exemplo abaixo:
A saida do comando:
find -type f -exec file -ib {} \; | awk '{count[$1]++}END{for(j in count) print j,"("count[j]" occurences)"}'|sort -t"/" -k1| awk '{print NR , $0}'
É:
1 application/gzip; (1 occurences)
2 application/octet-stream; (1 occurences)
3 application/pdf; (36 occurences)
4 application/pgp-signature; (3 occurences)
5 application/postscript; (1 occurences)
6 application/vnd.debian.binary-package; (8 occurences)
7 text/html; (509 occurences)
8 text/x-shellscript; (240 occurences)

A ESCOLHA do USUáRIO, foi:
TIPO= "1,2"
awk -F '[ \/]' '/^1 |^2 / {print $3}' log01.txt #TEM ESPAÇO APÓS O Nº
gzip;
octet-stream;
Portanto, ao meu ver, deve ser usada a saída de "awk -F '[ \/]' '/^1 |^2 / {print $3}' log01.txt", como "PADRÃO",
para copiar/mover os arquivos.
Alternativas:
Gerar o arquivo "arquivos_temp.txt"
find -type f -exec file -i {} \; > arquivos_temp.txt
"Observe que o comando "file -i" mostra o caminho completo do arquivo"
Agora é só "filtrar" arquivo_temp.txt, com a saída do comando awk -F '[ \/]' '/^1 |^2 / {print $3}' log01.txt
awk -F: '/octet-stream;|gzip;/ {print $1}' ARQUIVOS.txt
./SCRIPTS/FLASH_PLAYER/flash_player_npapi_linux.x86_64.tar.gz
./GOOGLE_CHROME/googlechrome53.0.2785.116.sxz

Ou
egrep 'octet-stream;|gzip;' ARQUIVOS.txt|cut -d: -f1
./SCRIPTS/FLASH_PLAYER/flash_player_npapi_linux.x86_64.tar.gz
./GOOGLE_CHROME/googlechrome53.0.2785.116.sxz

BUSCANDO e COPIANDO
awk -F: '/octet-stream;|gzip;/ {print $1}' ARQUIVOS.txt|xargs -iX cp X TST/
É isso....

Abç.:
Marcelo Oliver








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts