Localiza arquivos baseados no nome do prefixo do diretório e copia no diretório

0

Pergunta:

Alguém pode, por favor, mostrar a maneira mais simples de fazer isso em um script de shell.

Eu tenho a seguinte lista contendo os nomes dos diretórios:

head -3 list.txt

271_Lsasrv_dll_MS04-011
350_Util_Manager_MS04-019
351_POSIX_MS04-020

Para cada entrada na lista.txt cd no diretório existente:

cd 271_Lsasrv_dll_MS04-011/

Pegue o número do prefixo e pesquise em /usr/share/exploitdb/ path

find /usr/share/exploitdb/ -name  271.*
/usr/share/exploitdb/platforms/windows/local/271.c

Copie o arquivo para o diretório existente

cp /usr/share/exploitdb/platforms/windows/local/271.c .

Voltar para o diretório pai:

cd ..

Informações do sistema operacional:

uname -a
(Debian 4.6.4-1kali1)

O que eu tentei?

Eu achei simples o suficiente para criar os diretórios ...

for fldr in $(cat list.txt); do mkdir -p $fldr; done

... mas não tem certeza da melhor maneira de usar o corte e atribuir a variáveis, etc. Seria ótimo saber que usuários experientes do Linux abordam isso.

    
por ade1e 21.04.2017 / 11:06

2 respostas

2

Tente isso, e se precisar de refinamento, me avise:

while read line; 
do
  mkdir -p "${line}"
  prefix='echo "${line}" | cut -d'_' -f1'
  find /usr/share/exploitdb/ -name  "${prefix}".* -exec echo {} "${line}/" \;
done < list.txt

Substitua o echo por cp do find se a saída do comando parecer boa para você.

    
por 21.04.2017 / 11:21
1
< list.txt xargs -r sh -fc '
   mkdir -p "$@"
   cmd="find /usr/share/exploitdb -name ${1%%_*}.* -exec cp -vt $1/. {} +"; shift
   for d; do cmd="${cmd} -o -name ${d%%_*}.* -exec cp -vt $d/. {} +"; done
   $cmd
' sh

Trabalhando:

  • O ponto de partida é o arquivo list.txt que é canalizado para xargs , que por sua vez os transfere para sh em um modo slurp em sua lista de argumentos.
  • Em seguida, os diretórios são criados, se ainda não estiverem presentes.
  • Agora, dynamically criamos o comando find com base nos dados que nos são transmitidos de uma maneira que todos os arquivos com nomes comuns são extraídos de uma só vez e cp de uma só vez no diretório apropriado. Isso ajuda a manter as invocações de find no mínimo. Por exemplo, aqui está como seria o comando find para o conjunto de dados mostrado pelo OP :

    find /usr/shar/exploitdb -name 271.* -exec cp -vt 271_Lsasrv_dll_MS04-011/. {} + -o -name 350.* -exec cp -vt 350_Util_Manager_MS04-019/. {} + -o -name 351.* -exec cp -vt 351_POSIX_MS04-020/. {} +

  • Supondo que o diretório não contenha espaços em branco e metacaracteres de shell.

por 21.04.2017 / 12:58