我正在使用带有 bash 的 archlinux。我一直在尝试创建一个新的别名,但bashrc
不喜欢我的花括号。下面的命令应该计算.mkv
我目录中每个视频的持续时间长度(深度=3)并将其转换为小时。
alias vidlength="find . -maxdepth 3 -iname '*.mkv' -exec ffprobe -v quiet -of csv=p=0 -show_entries format=duration {} \; | paste -sd+ -| bc | awk '{print(($1/60)/60)}'"
当我运行源代码$ source ~/.bashrc
并
$ vidlength
随后运行它时,出现此错误:
awk: cmd. line:1: {print((/60)/60)}
awk: cmd. line:1: ^ syntax error
Bashrc 和类似的东西对我来说相当新,我在谷歌上找不到任何类似的问题。任何帮助都非常感谢。:)
答案1
该问题与您的“花括号”无关。
您过去常常引用整个别名值,因此在 awk 中您想要表示“字段 1”的"
字符串被扩展为$1
别名定义时的 shell 参数 1这是一个空值;因此表达式((/60)/60)
毫无意义——您试图将某个值除以 60,但结果为空。您可以用反斜杠将 括起来$
,或者您可以使用技巧,即 awk 字段引用在带有空格的情况下仍能正常工作,例如$ 1
或 ,$ NF
而 shell 参数则不行。
或者,使用 shell 函数(接受完整的 shell 语法)而不是别名(要求将所有内容打包成一个字符串):
function vidlength {
find . -maxdepth 3 -iname '*.mkv' -exec ffprobe -v quiet -of csv=p=0 -show_entries format=duration {} \; |
paste -sd+ -| bc | awk '{print(($1/60)/60)}'
}
此外,您可以通过让 awk 执行加法而不是单独的 bc 来简化此过程,并且不需要所有括号:
find . -maxdepth 3 -iname '*.mkv' -exec ffprobe -v quiet -of csv=p=0 -show_entries format=duration {} \; |
awk '{tot+=$ 1} END{print tot/3600}'
# I used the $ 1 syntax to allow use in alias, can use $1 in function