bash移动失败了

bash移动失败了,bash,shell,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 "

我在脚本中运行以下命令

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 

不确定为什么正则表达式中的move命令会失败

您的脚本过于复杂,并且有几个问题,其中之一就是问题所在,我想这是
ls | grep…
部分,但要找到答案,您应该包括一些调试日志

  • for i in$(cat…)
    循环遍历单词,而不是行
  • 如果您仍然这样做,请不要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"
而IFS=read-r jid;做
如果ls“$JOB_DIR/$jid-”*&>/dev/null;然后
TARGET_DIR=“$JOB_DIR/$jid/jobs”
mkdir-p“$TARGET_DIR”
mv“$JOB\u DIR/$jid-”*“$TARGET\u DIR”
回音“OK”
其他的
echo“没有要移动的文件。”
fi
完成<“$JOBS\u文件”

这里的用例是什么?解释问题,不要告诉我们为什么你的代码不起作用!