重击失败

时间:2019-01-11 08:33:06

标签: bash shell

我正在脚本中的命令下方运行

move_jobs() {
  cd $JOB_DIR
    for i in `cat $JOBS_FILE`
      do
        if [ `ls | grep -i ^${i}- | wc -l` -gt 0 ]; then
          cd $i
              if  [ ! -d jobs ]; then
                 mkdir jobs && cd .. && mv "${i}"-* "${i}"/jobs/
              else
                  cd .. && mv "${i}"-* "${i}"/jobs/
              fi
          error_handler $?
         fi
      done
}

但失败

mv: cannot stat `folder-*': No such file or directory 

不确定为什么移动命令以正则表达式失败

1 个答案:

答案 0 :(得分:4)

您的脚本过于复杂,有几个问题,其中一个是问题,我想这是ls | grep ...部分,但是要找出答案,您应该包括一些调试日志记录。

  • for i in $(cat ...)遍历单词而不是行。
  • Do not parse ls
  • 如果您仍然这样做,则不要grep输入文件名,而应将其包含在ls调用中:ls "${i}"-* | wc -l
  • 仅当创建文件夹时,才需要检查文件夹是否存在。您可以改用mkdir -p
  • 在脚本中的文件夹之间跳转几乎使它不可读,因为在读取脚本时需要跟踪所有cd命令。

您可以简单地编写以下内容,我认为它将满足您的要求:

xargs -a "$JOBS_FILE" -I{} \
  sh -c "
    mkdir -p '$JOB_DIR/{}/jobs';
    mv '$JOB_DIR/{}-'* '$JOB_DIR/{}/jobs';
 "

或者如果您需要更多控制权:

while IFS= read -r jid; do
    if ls "$JOB_DIR/$jid-"* &>/dev/null; then
        TARGET_DIR="$JOB_DIR/$jid/jobs"
        mkdir -p "$TARGET_DIR"
        mv "$JOB_DIR/$jid-"* "$TARGET_DIR"
        echo "OK"
    else
        echo "No files to move."
    fi
done < "$JOBS_FILE"