Renomeando ou tornando nomes de arquivos únicos

1

Eu escrevi um procedimento plsql usando o arquivo utl para criar arquivos no diretório temp no Unix.

Estou enviando os nomes dos arquivos para um script de shell para enviar esses arquivos e excluí-los após o envio do diretório temporário, mas quando duas pessoas executando a mesma solicitação com os mesmos arquivos, os arquivos são substituídos e excluídos pelo primeiro programa e o segundo programa não possui nenhum arquivo no diretório para o mail.

Eu decidi criar o arquivo names_request_id para criar nomes de arquivos exclusivos, mas meu requisito real é obter os arquivos com o mesmo nome sem request_id para a pessoa que está recebendo e-mail.

Eu criei Incompatibility para o programa com o mesmo programa, mas eles querem que eu tire a incompatibilidade para economizar tempo.

Quais outras opções eu tenho?

Para sua referência, copiei todo o meu shell script e adicionei o símbolo ####### para indicar a localização do código a ser modificado.

Os arquivos são movidos para o diretório criado e os nomes dos arquivos têm reuest_id-filename.extension, de modo que request_id e o '-' devem ser removidos e o nome do arquivo real deve estar lá. nome do arquivo no banco de dados: 23456663-abcd.pdf nome obrigatório do nome do arquivo: abcd.pdf

param='echo $*'
#getting input values
echo "params : $param"

v_temp='echo $param  | cut -d '"' -f 1 '
v_temp='echo $v_temp | cut -d '=' -f 2 '
v_temp='echo $v_temp | cut -d ' ' -f 1 '
#now v_temp has the request_id
v_temp=MUILT_EMAIL3-$v_temp

echo "temp file is : $v_temp"


#split the parameter string with " as seperator
v_email_list='echo $param | cut -d '"' -f 8 '
v_file_list='echo $param | cut -d '"' -f 10 '
v_subject='echo $param | cut -d '"' -f 12 '
v_mail_content='echo $param | cut -d '"' -f 14 '
v_reply_to='echo $param | cut -d '"' -f 16 '
v_delete_attachment_files='echo "$1"|cut -d'"' -f18'
v_outputfile_path='echo "$1"|cut -d'"' -f20'
v_outputfile='echo "$1"|cut -d'"' -f22'
v_request_id='echo "$1"|cut -d'"' -f24'
#v_rename_file='echo $param | cut -d '"' -f 24 '
echo "email list :" $v_email_list
echo "file list :" $v_file_list
echo "subject :" $v_subject
echo "mail_content :" $v_mail_content
echo "reply_to :" $v_reply_to
echo "delete_attachment_files :" $v_delete_attachment_files
echo "outputfile_path :" $v_outputfile_path
echo "outputfile :" $v_outputfile
echo "request_id :" $v_request_id

v_email_list='echo $v_email_list |tr ";" " "'
v_file_list='echo $v_file_list |tr ";" " "'

pwd
cd /


mkdir /tmp/$v_request_id
cp $v_outputfile_path /tmp/$v_request_id/$v_outputfile

mv /tmp/$v_request_id* /tmp/$v_request_id/ 
cd /tmp/$v_request_id/

###### this is the place i need to rename the files that are moved to a request_id dir
################# mv -- "34178248-2640006.pdf" "${34178248-2640006.pdf}" 


v_mail_content ='basename $v_mail_content'
cat $v_mail_content > /tmp/${v_temp}.tmp


echo "File List : $v_file_list"

for i in ${v_file_list}; do
    echo "File to attach before parsing $i"
    v_attachment_name='echo $i |awk '{ if ( index($1,":")> 0) { print substr($1,index($1,":")+1) } }''
    v_attachment_file='echo $i |awk '{ if ( index($1,":")> 0) { print substr($1,1,index($1,":")-1) } }''

    echo "Checking attachment name after parse :"$v_attachment_name
    if [ "$v_attachment_name" = '' ]
      then
      v_attachment_name='basename $i'
      v_attachment_file=$i
      echo "base name is " $v_attachment_name
    fi

    /usr/bin/uuencode $v_attachment_file $v_attachment_name >> /tmp/${v_temp}.tmp
done
echo "Loop done"

if [ "${v_reply_to}" = '' ]
  then
  mailx -s "${v_subject}" "${v_email_list}" < /tmp/${v_temp}.tmp
#echo "something" | mailx -s "${v_subject}" ${v_email_list} < /tmp/${v_temp}.tmp
else
  mailx -r "${v_reply_to}" -s "${v_subject}" "${v_email_list}" < /tmp/${v_temp}.tmp
#echo "something" | mailx -r "${v_reply_to}" -s "${v_subject}" ${v_email_list} < /tmp/${v_temp}.tmp
fi

echo "mailing done"

#delete the temporary files
  echo "deleting file /tmp/${v_temp}.tmp"
rm /tmp/${v_temp}.tmp


if [ "${v_delete_attachment_files}" = 'Y' ]
  then
    echo "deleting attached files -start "
    #Loop through to identify all the attachments and delete
    for i in ${v_file_list}; do
        echo $i
        v_attachment_name='echo $i |awk '{ if ( index($1,":")> 0) { print substr($1,index($1,":")+1) } }''
        v_attachment_file='echo $i |awk '{ if ( index($1,":")> 0) { print substr($1,1,index($1,":")-1) } }''

        echo "Check :"$v_attachment_name
        if [ "$v_attachment_name" = '' ]
          then
          v_attachment_name='basename $i'
          v_attachment_file=$i
          echo "base name is " $v_attachment_name
        fi

        echo "deleting file $v_attachment_file"
        rm $v_attachment_file
    done
    #End Loop through to identify all the attachments and delete
fi

echo "rm done"
    
por sam 03.07.2013 / 15:26

3 respostas

2

Uma solução alternativa seria criar um diretório temporário baseado no ID do processo do pedido, despejar os arquivos nesse diretório (talvez por meio de um comando cd antes de gerar os arquivos?), depois enviá-los a partir daí. Dessa forma, o segundo trabalho, com um PID diferente, estaria operando em um diretório diferente. Não tenho certeza de como isso funcionaria com os bits SQL, mas é aí que eu começaria meu ataque.

    
por 03.07.2013 / 15:58
2

Se você estiver apenas procurando criar um arquivo e / ou diretório temporário exclusivamente nomeado, poderá usar o comando mktemp em seu script.

Para criar um arquivo e / ou diretório nomeado aleatoriamente:

# file
$ mktemp
/tmp/tmp.4t0pSU5g3i

$  ls -l /tmp/tmp.4t0pSU5g3i
-rw------- 1 root root 0 Jul  3 11:05 /tmp/tmp.4t0pSU5g3i

# directory
$ mktemp -d
/tmp/tmp.WixJWjOPBb

$ ls -ld /tmp/tmp.WixJWjOPBb
drwx------ 2 root root 4096 Jul  3 11:04 /tmp/tmp.WixJWjOPBb

Se quiser sugerir apenas um nome sem realmente fazer a criação, você pode passar a opção --dry-run ou -u .

Referências

por 03.07.2013 / 17:09
0

Alterando minha resposta de acordo com a atualização da pergunta.

Se você quiser apenas alterar os nomes dos arquivos, um jeito simples seria:

filelist='ls *.pdf'
for i in $filelist
do
    mv $i 'echo $i|cut -d "-" -f 2'
done 

Pelo que entendi, você tem uma lista de arquivos e, dessa forma, apenas repete essa parte para remover o requestid do início do nome.

    
por 03.07.2013 / 15:53