BASH脚本通过MV给出了错误.可能很容易修复



编辑:末尾调用的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和其他一些地方。IIRC的MV的目的是清理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

应该真正重构整个脚本。诸如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
  • 将文件的一部分存储在变量$ old
  • 的$ OUTDIR中
  • 将所有(修理)文件名...移至$ 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 ...)构造。这些应该被删除。它们很危险。但是,让我们先了解实际发生的事情。

这个

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" .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')

始终引用您的变量,除非您有良好的,具体的理由不和理解效果。MV $ old $ new是与MV" $ old" $ new"截然不同的命令,可能不是您想要的。因此,引用您的变量,重新运行您的脚本并在仍然有问题的情况下回来。

相关内容

  • 没有找到相关文章

最新更新