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"?がない追加のファイル

ファイル名の例を使用して、実行したいことを記述できれば、これらの3行のコードを書き直して機能するようにするのは簡単です。

追加の知恵については、次のことを試してください。

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 に答える