bash脚本给mv错误...可能很容易修复

时间:2012-10-21 18:01:51

标签: bash variables hyperlink awk

编辑:最后调用的fixnames.sh可能会产生错误(尤其是第2行):

    #/bin/bash
    for x in *\'*;
    do
    y=$(echo "$x"| sed y/\'\,/__/)
    mv "$x" "$y"
    done

问题行是最后的mv命令

    mv $OUTDIR/$OLD $OUTDIR/$NEW

它出现错误,如:

    mv '*\* [something about unable to stat this]

这个脚本是我自定义的脚本http://www.mythtv.org/wiki/Removing_Commercials和其他一些地方。 mv的目标是,iirc,清理tmp目录(删除我笨拙地用来重命名文件的符号链接)。我有点不清楚该mv系列中发生了什么,之前的2行显然导致脚本无法干净地完成。感谢您的任何意见。

    #!/bin/sh
    VIDEODIR=$1
    FILENAME=$2
    CHANID=$3
    STARTTIME=$4
    # MythTV Install Prefix
    INSTALLPREFIX="/usr/bin"
    USRLOCALPREFIX="/usr/local/bin"
    HOMEDIR="/home/xxx"
    OUTDIR="/home/xxx/trans-out"
    TMPDIR="/home/xxx/trans-out/tmp"

    if [ ! -d $TMPDIR ]; then mkdir $TMPDIR; fi
    rm -f $TMPDIR/*

    # Sanity checking, to make sure everything is in order.
    if [ -z "$VIDEODIR" -o -z "$FILENAME" -o -z "$CHANID" -o -z "$STARTTIME" ]; then
            echo "Usage: $0 <VideoDirectory> <FileName> <CHANID> <STARTTIME>"
            exit 5
    fi
    if [ ! -f "$VIDEODIR/$FILENAME" ]; then
            echo "File does not exist: $VIDEODIR/$FILENAME"
            exit 6
    fi
    # The meat of the script. Flag commercials, copy the flagged commercials to
    # the cutlist, and transcode the video to remove the commercials from the
    # file.

    $INSTALLPREFIX/mythtranscode --chanid $CHANID --starttime $STARTTIME --mpeg2 --honorcutlist --showprogress -o $OUTDIR/$FILENAME.tmp
    ERROR=$?
    if [ $ERROR -ne 0 ]; then
            echo "Transcoding failed for ${FILENAME} with error $ERROR"
            exit $ERROR
    fi

    # use mythlink script to extract program information from database and make link in tmp subfolder for renaming of transcoded version.
    $USRLOCALPREFIX/mythlink.pl --link $TMPDIR --chanid $CHANID --starttime $STARTTIME --underscores --separator _ --format %T_%oY%om%od_%S

    # remove the map file since we are transcoding
    rm -f $OUTDIR/$FILENAME.tmp.map

    # set variables for newfilename-link and oldfilename-transcoded file and then to rename transcoded with link name
    NEW=$(ls $TMPDIR)
    OLD=$(ls $OUTDIR | grep -i "mpg.tmp" | awk '{ print $1; }')
    mv $OUTDIR/$OLD $OUTDIR/$NEW

    # remove commas and apostraphies
    cd $OUTDIR && $USRLOCALPREFIX/fixnames.sh

3 个答案:

答案 0 :(得分:4)

这整个脚本应该真的被重构。像NEW=$(ls $TMPDIR)这样的构造非常糟糕。有关详细信息,请参阅ParsingLS

暂时看一下剧本中令人反感的部分......

# set variables for newfilename-link and oldfilename-transcoded file and then to rename transcoded with link name
NEW=$(ls $TMPDIR)
OLD=$(ls $OUTDIR | grep -i "mpg.tmp" | awk '{ print $1; }')
mv $OUTDIR/$OLD $OUTDIR/$NEW

我在元代码中读到的内容是:

  • 将$ TMPDIR中所有内容的文件名存储到变量$ NEW
  • 将$ OUTDIR中文件子集的某些部分存储到变量$ OLD
  • 将所有(受损的)文件名...移至$ TMPDIR?

这对我来说没什么意义。你真的的文件是否以" mpg.tmp"结尾(有空格)?以及匹配前一位的其他文件,但没有" mpg.tmp"

如果您可以使用示例文件名来描述您想要完成的任务,那么重写这三行代码应该很容易,因此它们可以正常工作。

如需更多智慧,请尝试以下方法:

NEW=$(ls $TMPDIR)
OLD=$(ls $OUTDIR | awk '/mpg\.tmp/{ print $1; }')
echo "mv $OUTDIR/$OLD $OUTDIR/$NEW" >> /tmp/mytherror.log
mv $OUTDIR/$OLD $OUTDIR/$NEW

看看/tmp/mytherror.log中出现了什么。

请注意,我主张您使用var=$(ls ...)构造。那些应该删除。他们很危险。但是,让我们先了解实际发生的事情。

答案 1 :(得分:0)

总是引用你的变量,除非你有一个很好的,特定的理由不去理解这些影响。 mv $ OLD $ NEW是与mv“$ OLD”“$ NEW”完全不同的命令,可能不是你想要的。所以,引用你的变量,重新运行你的脚本,如果它仍有问题,请回来。

答案 2 :(得分:0)

这是什么

NEW=$(ls $TMPDIR)
OLD=$(ls $OUTDIR | grep -i "mpg.tmp" | awk '{ print $1; }')
mv $OUTDIR/$OLD $OUTDIR/$NEW

告诉我你的“.mpg.tmp”文件位于/home/xxx/trans-out,你试图将它们(可能也重命名为“.mpg”)移动到/home/xxx/trans-out/tmp(覆盖同名的“.mpg”文件?)。

至于为什么它不起作用,假设NEWOLD确实包含了你想要的文件列表:

  • NEW包含“new1”,“new2”,“new3”
  • OLD包含“old1”,“old2”,“old3”

语句mv $OUTDIR/$OLD $OUTDIR/$NEW将扩展为

mv $OUTDIR/new1 new2 new3 old1 $OUTDIR/old2 old3

这意味着:将5个文件(“$ OUTDIR / new1”,“new2”,“new3”,“old1”,“$ OUTDIR / old2”)移动到目录“old3”。


我怀疑可以用这个

替换那3行
for tmpfile in "$OUTDIR"/*.mpg.tmp; do
    mv "$tmpfile" "$TMPDIR/${tmpfile%.tmp}"
done

(我假设awk用于从扩展名中删除'.tmp'