0

编辑:最后调用的 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
4

3 回答 3

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 ...)构造。那些应该被删除。他们很危险。但让我们先了解实际发生的情况。

于 2012-10-21T18:18:39.837 回答
0

总是引用你的变量,除非你有一个很好的、具体的理由不去理解这些影响。mv $OLD $NEW 是与 mv "$OLD" "$NEW" 非常不同的命令,可能不是您想要的。所以,引用你的变量,重新运行你的脚本,如果它仍然有问题就回来。

于 2012-10-21T19:45:16.430 回答
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”文件?)。

至于为什么它不起作用,假设NEW并且OLD确实包含您想要的文件列表:

  • 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”)

于 2012-10-22T01:01:35.960 回答