이름을 바꾸거나 파일 이름을 고유하게 만드세요.

이름을 바꾸거나 파일 이름을 고유하게 만드세요.

나는 utl 파일을 사용하여 Unix 임시 디렉토리에 파일을 생성하는 plsql 프로시저를 작성했습니다.

파일 이름을 쉘 스크립트에 보내서 파일을 메일로 보내고 임시 디렉터리에서 메일로 보낸 후 삭제하면 잘 작동하지만 두 사람이 같은 파일로 동일한 요청을 실행하면 파일이 첫 번째 파일로 대체됩니다. 삭제된 프로그램과 두 번째 프로그램은 메일로 보낼 디렉토리에 파일이 없습니다.

파일 이름을 고유하게 만들기 위해 names_request_id 파일을 만들기로 결정했지만 실제 요구 사항은 이메일을 받는 사람에게 request_id 없이 동일한 이름의 파일을 가져오는 것입니다.

동일한 프로그램에 대해 비호환성을 생성했지만 시간을 절약하기 위해 비호환성을 제거하기를 원합니다.

다른 어떤 옵션이 있나요?

참고로 쉘 스크립트 전체를 복사하고 수정하려는 코드의 위치를 ​​표시하기 위해 ####### 기호를 추가했습니다.

생성된 디렉터리로 파일이 이동되고 파일 이름에는 reuest_id-filename.extension이 있으므로 request_id와 "-"를 제거하고 실제 파일 이름이 있어야 합니다. 데이터베이스의 파일 이름: 23456663-abcd.pdf 필수 파일 이름: 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"

답변1

또 다른 해결책은 요청된 프로세스 ID를 기반으로 임시 디렉터리를 만들고 파일을 해당 디렉터리에 덤프한 다음(아마도 cd파일을 생성하기 전에 명령을 통해?) 거기에서 메일로 보내는 것입니다. 이렇게 하면 다른 PID를 가진 두 번째 작업이 다른 디렉터리에서 실행됩니다. SQL 비트가 어떻게 작동하게 될지는 잘 모르겠지만, 여기서부터 공격을 시작합니다.

답변2

고유한 이름의 임시 파일 및/또는 디렉터리를 생성하려는 경우 mktemp스크립트에서 이 명령을 사용할 수 있습니다.

무작위로 이름이 지정된 파일 및/또는 디렉터리를 생성하려면 다음을 수행하십시오.

# 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

실제로 이름을 만들지 않고 이름만 제안하도록 하려면 --dry-run또는 -u스위치를 전달하면 됩니다.

인용하다

답변3

질문 업데이트에 따라 답변을 변경합니다.

파일 이름만 변경하려는 경우 쉬운 방법은 다음과 같습니다.

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

내가 이해한 바에 따르면 파일 목록이 있으므로 이 부분을 반복하여 이름 시작 부분에서 요청 ID를 제거하면 됩니다.

관련 정보