命令在Linux终端中运行,但在bash脚本中不运行

时间:2012-05-25 06:44:37

标签: bash shell

我想自动修复某些视频的索引编制过程。以下是我的代码。

for f in ~/Videos/Temp/*
do
    f=$(echo $f | sed 's/ /\\ /g')
    name=$(echo $f | sed 's/Temp/Fixed/1')
    mencoder -forceidx "$f" -o "$name" -oac copy -ovc copy
done

我遇到的问题是mencoder声称它无法在变量$ f中找到文件存储。

MEncoder svn r34540 (Ubuntu), built with gcc-4.6 (C) 2000-2012 MPlayer Team
File not found: '/home/name/Videos/Temp/file\ name.avi'
Failed to open /home/bryan/Videos/Temp/file\ name.avi.
Cannot open file/device.

Exiting...

当我使用扩展变量将命令打印到终端并运行它时,它可以正常工作。我甚至修改了上面的代码来打印出修复每个视频的命令,将其粘贴到一个新的脚本中,一切都顺利完成。我在Ubuntu上运行它。关于可能导致这种情况的任何想法?

2 个答案:

答案 0 :(得分:1)

正如其他人所指出的那样,您无需手动转义文件名中的空格。但是,您也不需要使用sed来修改路径。

for f in ~/Videos/Temp/*
do
    mencoder -forceidx "$f" -o "${f/Temp/Fixed}" -oac copy -ovc copy
done

只有第一次出现的“Temp”被替换为“Fixed”,因此您无需担心文件名中的意外替换。

答案 1 :(得分:0)



    find ~/Videos/Temp/ -type f -print0 | while IFS= read -r -d $'\0' f; do
        name=$(echo "$f" | sed 's/Temp/Fixed/1')
        mencoder -forceidx "$f" -o "$name" -oac copy -ovc copy
    done