【问题标题】:Delete file in multiple directories on remote server using SSH使用 SSH 删除远程服务器上多个目录中的文件
【发布时间】:2017-05-15 10:47:03
【问题描述】:

我编写了一个脚本来删除远程服务器上的文件。有多个目录,脚本移动到每个目录并找到比定义时间更旧的文件并将其删除。但是如果脚本找到要删除的文件,它会删除它们并退出 while 循环。

输入:目录列表文件,包含目录列表和文件名。

下面是代码。

MsgLog " Step 1: Start checking directories for old logs"
cat $DIRECTORY_LIST | while read DIR;
do
read LOG_FILE
read LOG_RET_PERIOD

MsgLog "Inputs"
MsgLog "Server=$SERVER User=$USER Log_path=$DIR Log_file=$LOG_FILE Log_Retention_Period=$LOG_RET_PERIOD"

                ssh -q -n -o 'BatchMode yes' $USER@$SERVER "cd $DIR;find $LOG_FILE* -mtime +$LOG_RET_PERIOD" >>$FIND_log

                ERROR_MSG=$?
                        if [ $ERROR_MSG -ne 0 ]
                        then
                                MsgLog "ERROR $ERROR_MSG: Could not connect."
                                exit 1
                        fi

                if [ -s "$FIND_log" ]
                        then
                        MsgLog "  Files to delete:"
                        cat $FIND_log
                        ssh $USER@$SERVER "cd $DIR;find $LOG_FILE* -mtime +$LOG_RET_PERIOD -exec rm {} \;"
                        ERROR_MSG=$?
                        if [ $ERROR_MSG -ne 0 ]
                        then
                                MsgLog "ERROR $ERROR_MSG: Step 1, Could not delete old Log Files."
                                exit 1
                        fi
                else
                        MsgLog "  No log files to delete."
                fi
        rm $FIND_log
        MsgLog "Move to next directory"
done
MsgLog "No more directories"

if [ "$EXIT_CODE" = 0 ]
then
  MsgLog "$BNAME successfully completed"
else
  MsgLog "$BNAME completed with errors"
fi

exit $EXIT_CODE

我希望它循环到所有目录。但是当它从任何目录中找到并删除文件时,它会退出循环。

【问题讨论】:

    标签: shell ssh


    【解决方案1】:

    问题在于在cat $DIRECTORY_LIST | while read DIR 使用read

    read 的某些实现上,尤其是在 RedHat 派生发行版上,read 是一个 shell 脚本,它的输出会在 shell 更改时重置。

    由于每次ssh 登录到另一台主机时,shell 都会发生变化,因此循环在第一次 ssh 调用后停止。

    将顶部循环改成不使用read的东西,例如:

    for DIR in `cat $DIRECTORY_LIST`; do
    <..>
    done
    

    【讨论】:

    • 但是我的目录列表在一行中有路径名,下一行有文件名,下一行有保留期,依此类推。每个文件的文件名和保留期限都会发生变化。
    • 那么您还需要将read 的这些用法替换为其他内容。
    • 以上,仅当read的值被循环使用时。
    • 非常感谢。我替换了所有“读取”命令。它现在正在工作!
    • 太棒了,很高兴它有效。如果它回答了您的问题,请接受答案;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    相关资源
    最近更新 更多