私はutlファイルを使用してUnix一時ディレクトリにファイルを生成するplsqlプロシージャを作成しました。
ファイル名をシェルスクリプトに送信し、ファイルをメールで送信し、一時ディレクトリからメールで送信した後に削除するとうまく機能しますが、2人が同じファイルで同じ要求を実行すると、ファイルは最初のファイルに置き換えられます。削除されたプログラムと2番目のプログラムは、メールで送信するディレクトリにファイルがありません。
ファイル名を一意にするために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を持つ2番目のタスクが別のディレクトリで実行されます。 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を削除するだけです。