【发布时间】:2011-07-29 19:06:13
【问题描述】:
我正在编写一个 shell 脚本,通过Handbrake 批量处理相机上的 .mov 文件,以节省高清空间。该脚本使用“find”搜索目录,然后在找到的每个 .mov 文件上运行 Handbrake,将结果文件的创建日期与源文件的“touch”日期匹配。
我最初是通过 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 文件,因此循环结构正确。
我相信我在this stackoverflow thread 上的问题得到了部分答案。但是解决方案是特定于 ssh 的,并不能解决一般问题。似乎与子进程使用标准输入有关,但我不完全理解这是如何工作的。
有什么建议吗?
我使用的是 OSX 10.6
【问题讨论】:
-
${SHELL}=='/bin/bash',一个假设? -
如果不知道 $* 应该是什么,就无法回答这个问题。它应该是文件或目录的列表吗?还是当前目录?看起来很像您只是使用了错误的
file参数和错误的 shell 特殊参数(例如,使用file "$@"而不是"$*")。 -
"$*"肯定是错的;你肯定想要"$@"。
标签: shell loops for-loop while-loop