if [ -f *.mp4 ]; then
for file in *.mp4; do
ffmpeg2theora -v 8 --nometadata "$file"
rm -f "$file"
done
fi
if [ -f *.avi ]; then
for file in *.avi; do
ffmpeg2theora -v 8 --nometadata "$file"
rm -f "$file"
done
fi
我无法弄清楚为什么if [ -f *.mp4 ]; then
没有检测到mp4文件,我使用这个方法来查找.avi,.epub,.chm和其他一些扩展,它运行得很好。我想知道是不是因为4
。我也试过if [ -f *."mp4" ]; then
,但它没有用。
我觉得奇怪的是for file in *.mp4; do
检测到.mp4文件而if [ -f *.mp4 ]
没有!
答案 0 :(得分:1)
使用bash选项nullglob
允许globs扩展为零元素。这样,如果没有匹配的文件,循环就不会运行:
shopt -s nullglob
for file in *.mp4; do
ffmpeg2theora -v 8 --nometadata "$file" && rm -f "$file" || \
echo Problem transcoding "$file"
done
至于[ -f *.mp4 ]
,只有当只有一个匹配的文件才会正常工作,因为它会扩展为[ -f myfile.mp4 ]
。
如果没有匹配的文件,它可能仍然有效(没有nullglob),因为它最终检查名称中带星号的文件,希望不存在。
如果有多个文件,则会失败,因为[ -f file1.mp4 file2.mp4 file3.mp4 ]
无效test
语法。
答案 1 :(得分:1)
if [ -f *.mp4 ]; then
测试中没有扩展。该测试正在寻找一个名为*.mp4
的文件,该文件不存在。你应该做什么:
for i in *.mp4; do
<do something>
done
此处扩展将在当前工作目录中提供具有.mp4
扩展名的所有文件。您也可以find /path/to/dir -type f -name "*.mp4"
获取文件名。 (注意:这需要.mp4
个文件存在于目录中。如果不是,i=*.mp4
。你做得更安全:
find /path -type f -name "*.mp4" | while read i; do
<do whatever>
done