编辑:末尾调用的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"文件同名?)。
关于为什么不起作用,假设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')
始终引用您的变量,除非您有良好的,具体的理由不和理解效果。MV $ old $ new是与MV" $ old" $ new"截然不同的命令,可能不是您想要的。因此,引用您的变量,重新运行您的脚本并在仍然有问题的情况下回来。