我在bash脚本中有点初学者。我这里有一些脚本,可以将文件上传到sftp服务器。然后它将文件移动到其他目录。 否则回显有关source_dir中没有文件的信息。问题是它没有移动文件,并且在文件已经上传后循环回到sftp登录。
cd /dest_dir/
for file5 in *.test
do
if test -f $file5
then
echo 'some text.'
((
echo "
cd /dest_dir/
lcd /source_dir/
mput *.test
exit
"
) | sftp "user"@"host")
sleep 3
mv /source_dir/$file5 /source_dir/test/
else
echo -e 'some text'
fi
答案 0 :(得分:0)
通常没有理由检查您正在循环的文件是否确实存在。如果某个文件可能会在for
和test
之间消失,那么它也可能会在test
和echo
之间消失,在这种情况下,您最终会引用一个不再存在的文件。
#!/bin/bash
shopt -s nullglob # bash-only feature
cd /dest_dir/
(#echo "cd /dest_dir/" # no use, you already did above
echo "lcd /source_dir/"
for file in *.test; do
echo put "$file"
done
echo "exit" ) | sftp "user"@"host"
mv *.test /source_dir/test/
这会为所有文件打开一个scp
连接。它有一个明显的缺点,如果其中一个文件由于某种原因失败,脚本就不会捕获它。
除了shopt -s nullglob
之外,这通常可以移植到Bourne shell。
答案 1 :(得分:0)
谢谢您的提示。我做到了:登录:
SFTP_HOST="host"
SFTP_LOGIN="USER"
cd /path/
mylog=/path/sftp_session_$(date "+%Y_%m_%d").log
echo "$(date "+%Y-%m-%d %H:%M:%S") - text" >> $mylog
let licz5=`ls|wc -l`
let jest_plik=0
for file5 in *.test
do
if test -f /patch_source1/$file5
then
let jest_plik=1
echo "$(date "+%H:%M:%S") - transfer pliku "$file5" na serwer "$SFTP_HOST >> $mylog
fi
if test -f /source_patch2/$file6
then
echo "$(date "+%H:%M:%S") - transfer pliku "$file6" na serwer "$SFTP_HOST >> $mylog
fi
if test -f /source_patch3/$file7
then
echo "$(date "+%H:%M:%S") - transfer pliku "$file7" na serwer "$SFTP_HOST >> $mylog
fi
if test -f /source_patch4/$file8
then
echo "$(date "+%H:%M:%S") - transfer pliku "$file8" na serwer "$SFTP_HOST >> $mylog
fi
done
if test $jest_plik -eq 1
then
echo 'text.'
(echo 'cd /dest_dir/
lcd /source_p_1/
mput *.test
lcd /source_p_2/
mput *.test
lcd /source_p_3/
mput *.test
lcd /source_p_4/
mput *.test
exit') | sftp $SFTP_LOGIN@$SFTP_HOST
echo "$(date "+%H:%M:%S") - send ok." >> $mylog
else
echo -e 'text'
fi