我正在编写一个shell脚本,批处理从我的相机中下载的.mov文件,通过Handbrake来节省高清空间。该脚本使用'find'在目录中搜索文件,然后对找到的每个.mov文件运行Handbrake,使用'touch'将生成文件的创建日期与源文件的日期匹配。
最初我使用了for循环来完成这个任务:
这个循环的问题在于它只适用于目录中的第一个文件,然后退出循环。请注意,如果我在while循环体中替换为"echo $i",它会打印出目录中所有的 .mov 文件,因此循环结构是正确的。
我认为我的问题在这个stackoverflow线程上有部分答案。但该解决方案特定于ssh,并不能解决一般问题。似乎与子进程使用stdin有关,但我不完全理解其工作原理。
有什么建议吗?
我使用的是OSX 10.6。
最初我使用了for循环来完成这个任务:
for i in $(find "$*" -iname '*.mov') ; do
~/Unix/HandbrakeCLI --input "$i" --output "$i".mp4 --preset="Normal"
touch -r "$i" "$i".mp4
done
这样做是有效的,但如果输入文件名包含空格,则会失败。因此我尝试使用while循环代替:
find "$*" -iname '*.mov' | while read i ; do
~/Unix/HandbrakeCLI --input "$i" --output "$i".mp4 --preset="Normal"
touch -r "$i" "$i".mp4
done
这个循环的问题在于它只适用于目录中的第一个文件,然后退出循环。请注意,如果我在while循环体中替换为"echo $i",它会打印出目录中所有的 .mov 文件,因此循环结构是正确的。
我认为我的问题在这个stackoverflow线程上有部分答案。但该解决方案特定于ssh,并不能解决一般问题。似乎与子进程使用stdin有关,但我不完全理解其工作原理。
有什么建议吗?
我使用的是OSX 10.6。
${SHELL}
=='/bin/bash'
,一个人会认为是这样吧? - johnsywebfile
参数和错误的 shell 特殊参数(例如,使用file "$@"
而不是"$*"
)。 - Jens"$*"
很明显是错误的;你肯定想要使用"$@"
。 - Charles Duffy