批量转换文件夹和子文件夹中的视频

时间:2010-08-01 16:04:19

标签: bash loops

我有大量的视频需要转换成mp4。文件夹结构是这样的

Events
  Chicago
  Boston
  San Fran
  London Expo

每个活动内部都包含avi格式或.mkv的所有视频。我希望它们转换为相同的文件名。但是使用mp4扩展名。

我的问题是我如何遍历文件夹子文件夹,并保留文件名,因为目前他们有空格。这就是我现在所拥有的。

sourcedir="$1"
destdir="$2"
cd "$sourcedir"
for i in `ls`; do
  HandBrakeCLI -i "$i" -o "$destdir/${i%.*}.mp4" --preset="AppleTV"
  echo $i
done

菲利普斯代码:

cd "$sourcedir"
echo "Directory: $sourcedir"
destdir = sourcedir
for subdir in *
do
  if [[ -d "$subdir" ]]
  then
    for file in "$subdir"/*
    do
      HandBrakeCLI -i "$file" -o "${file%.*}.mp4" --preset=AppleTV
      echo "$file"
    done
  fi
done

4 个答案:

答案 0 :(得分:2)

使用嵌套循环,不要使用ls

for subdir in "$sourcedir"/*
do
  if [[ -d "$subdir" ]]
  then
    for file in "$subdir"/*
    do
      HandBrakeCLI -i "$file" -o "$destdir/${file%.*}.mp4" --preset=AppleTV
      echo "$file"
    done
  fi
done

另一种选择是使用find

find "$sourcedir" -maxdepth 2 -mindepth 2 -type f -exec bash -c 'HandBrakeCLI -i "$0" -o "'"$destdir"'/${0%.*}.mp4" --preset=AppleTV' '{}' ';' -print

两种解决方案都适用于包含空格或换行符的文件名。

答案 1 :(得分:1)

使用for i in "$sourcedir/*"(或者你已经完成了cd,你可以for i in *)。

或执行find "$sourcedir" -type f | while read -r i(对此,变量i将包含源目录名称,因此您必须使用大括号展开或basename来消除它。< / p>

答案 2 :(得分:1)

将程序更改为iVI link to iVi

这个程序可以做到这一点,甚至比手刹更好......

答案 3 :(得分:0)

bash 4

shopt -s globstar
destdir="/somewhere"
for file in **/*.mkv **/*.avi
do
  HandBrakeCLI -i "$file" -o "$destdir/${file%.*}.mp4" --preset=AppleTV
done