重命名或使文件名唯一

重命名或使文件名唯一

我编写了一个 plsql 过程,使用 utl 文件在 Unix 的临时目录中创建文件。

我将文件的名称发送到 shell 脚本来邮寄这些文件,并在从临时目录邮寄后删除,它运行良好,但是当两个人使用相同的文件运行相同的请求时,文件将被第一个替换并删除程序和第二个程序在目录中没有任何要邮件的文件。

我决定创建文件names_request_id以使文件名唯一,但我的实际要求是向接收电子邮件的人获取不带request_id的同名文件。

我为同一程序创建了不兼容性,但他们希望我消除不兼容性以节省时间。

我还有什么其他选择?

为了供您参考,我复制了整个 shell 脚本并添加了 ####### 符号来表示要修改的代码的位置。

文件将移动到创建的目录,并且文件名具有 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 

据我了解,您有一个文件列表,因此,只需迭代此部分即可从名称开头删除 requestid。

相关内容