Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 批量转换文件夹和子文件夹中的视频_Bash_Loops - Fatal编程技术网

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

Bash 批量转换文件夹和子文件夹中的视频,bash,loops,Bash,Loops,我收集了大量的视频,这些视频都需要转换成mp4。文件夹结构如下所示 Events Chicago Boston San Fran London Expo 在每个活动中,保存avi格式或.mkv格式的所有视频。我希望将它们转换为相同的文件名。但是mp4的扩展 我的问题是如何循环遍历文件夹子文件夹,并保留文件名,因为此时它们中有空格。。这是我目前的情况 sourcedir="$1" destdir="$2" cd "$sourcedir" for i in `ls`; do H

我收集了大量的视频,这些视频都需要转换成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
可以使用$sourcedir/*中的i,也可以使用*中的i

或者找到$sourcedir-type f |在读取-ri时,变量i将包含源目录名,因此您必须使用大括号扩展名或basename将其去掉。

在$sourcedir/*中使用for i,或者因为您已经在那里制作了cd,所以您可以在*中为i执行操作


或者在读取-r i时查找$sourcedir-type f |,变量i将包含源目录名,因此您必须使用大括号扩展或basename将其去掉。

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

另一个选项是使用查找:


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

使用嵌套循环,而不使用ls:

另一个选项是使用查找:

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

bash 4

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

将程序更改为iVI

此程序执行trcik,甚至比手刹更好…

将程序更改为iVI


这个程序做的很好,甚至比手刹更好…

非常感谢它工作得很好,我有一些损坏的avis!非常感谢,它工作得很好,我有一些损坏的阿维斯!1.避免在未选中use set-e或cd | | exit 1的情况下使用cd,或者更好的是,根本不要更改目录;否则,脚本可能会在错误的目录中运行。2.destdir=sourcedir不是赋值,但将尝试调用名为destdir.1的命令。避免在未选中use set-e或cd | | exit 1的情况下使用cd,或者更好的是,根本不要更改目录;否则,脚本可能会在错误的目录中运行。2.destdir=sourcedir不是赋值,但将尝试调用名为destdir的命令。
find "$sourcedir" -maxdepth 2 -mindepth 2 -type f -exec bash -c 'HandBrakeCLI -i "$0" -o "'"$destdir"'/${0%.*}.mp4" --preset=AppleTV' '{}' ';' -print
shopt -s globstar
destdir="/somewhere"
for file in **/*.mkv **/*.avi
do
  HandBrakeCLI -i "$file" -o "$destdir/${file%.*}.mp4" --preset=AppleTV
done