#/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
答案 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
我在元代码中读到的内容是:
这对我来说没什么意义。你真的的文件是否以" 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”文件?)。
至于为什么它不起作用,假设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'