我在ffmpeg 文档( section 3.2 How do I encode single pictures into movies?)上阅读了以下内容:
要将单张图片编码为电影,请运行以下命令:
ffmpeg -f image2 -i img%d.jpg movie.mpg
Run Code Online (Sandbox Code Playgroud)
请注意,`%d' 被图像编号替换: img%03d.jpg 表示序列 img001.jpg、img002.jpg 等...
我的问题是:谁在img%03d.jpg和之间进行翻译img001.jpg, img002.jpg, etc?它是shell还是ffmpeg?
我想请 ffmpeg 将一系列图像编码为视频。然而,我的序列通常以一个不同于 1 的索引开始,(例如,我们可以称之为start_index),并以我们可以称之为 的索引结束end_index。此外,该序列使用 value 的增量increment,例如:
img_0025.png, img_0030.png, img_0035.png, ... img_0100.png
Run Code Online (Sandbox Code Playgroud)
其中start_index是 25,end_index是 100,increment是 5。
我想将上述图像序列提供给 ffmpeg,而不必先重命名序列。文档解释了如何使用符号链接来做到这一点,但我想知道是否有办法完全避免它们,也许在 zsh 上使用高级通配符。
我认为 glob 模式:
**/(*|.*)
Run Code Online (Sandbox Code Playgroud)
将代表以点 ( .)开头或不以点 ( )开头的每个文件夹和文件,但它会跳过当前目录中以..开头的目录。
什么是 glob 模式,这意味着:
每个文件和文件夹可能会或可能不会
.在当前和更深的文件夹中开始
另外:如何从递归全局模式(例如上面的模式)中排除特定文件夹(或者甚至更好,全局子模式)?
我尝试了以下.hg从当前级别排除文件夹(但包括以.字符开头的其他文件夹):
**~.hg/*
Run Code Online (Sandbox Code Playgroud)
但它并没有递归地进入更深的目录。
我经常M-x query-replace在 Emacs ( M-%)上使用,我喜欢我可以灵活地在这些选项之间进行选择:
Spacebar Replace text and find the next occurrence
Del Leave text as is and find the next occurrence
. (period) Replace text, then stop looking for occurrences
! (exclamation point) Replace all occurrences without asking
^ (caret) Return the cursor to previously replaced text
Run Code Online (Sandbox Code Playgroud)
有没有办法:
到达文件末尾后循环回到文件的开头?
在命令执行过程中反转查找和替换的方向。
我在网上看到过xargs带有论点的例子-r0。这个论点是什么意思?我的手册页没有显示任何条目 -r0我见过的大多数手册页也没有显示(例如http://linux.die.net/man/1/xargs)
我有几个与非交互式、非登录 shell 和 cron 作业相关的问题。
一季度。我已经读过非交互式、非登录 shell 仅 "load" $BASH_ENV。这究竟是什么意思?这是否意味着我可以指向$BASH_ENV一个文件,并且该文件将被引用?
Q2:假设我有一个cron指向带有 Bash shebang 的 Bash 脚本的条目,我可以假设我的 Bash 脚本加载了哪些环境变量和定义?
Q3:如果我添加SHELL=/bin/bash到我的顶部crontab,这到底有什么作用?是否意味着:
cron 本身在 Bash 中运行?crontab在猛砸何解释?shebangs在其中,正在运行$SHELL还有什么?
Q4:如何设置BASH_ENV定时任务?
我正在尝试编写一个shell 脚本,它接收一个带参数的命令作为输入并运行它。
例如,我希望在cron以下情况下使用它:
0 11 * * * my_wrapper.sh "task_name" "command arg1 arg2 arg3 ..."
Run Code Online (Sandbox Code Playgroud)
什么的细节my_wrapper.sh无关紧要,但它是一个zsh脚本,我希望它接收command arg1 arg2 arg3 ...并调用它。请注意,参数可能包含单引号、双引号等。
向脚本传递和接收带有参数的命令的正确方法是什么?
在 zsh 的命令行上,@Gilles 的第一个解决方案效果很好:
#!/bin/zsh
task_name=$1
shift
"$@" > /path/to/logging_directory/$task_name
Run Code Online (Sandbox Code Playgroud)
然后> my_wrapper.sh date "%Y-%b-%d" 从命令行调用即可完成这项工作。
但是,当我尝试按如下方式使用它时cron:
CRON_WRAPPER="/long/path/to/my_wrapper.sh"
0 11 * * * $CRON_WRAPPER "current_date.log" date "+%Y-%b-%d"
Run Code Online (Sandbox Code Playgroud)
它不起作用。
正如吉尔斯的回答所解释的,crontab需要逃避任何%迹象。将以上更改为:
CRON_WRAPPER="/long/path/to/my_wrapper.sh"
0 11 * * * …Run Code Online (Sandbox Code Playgroud) 在 Bash 中,当我这样做时:
foo="*"
echo $foo
Run Code Online (Sandbox Code Playgroud)
它扩展*到当前文件夹的内容。我如何确保它只打印一个文字*?
顺便说一下,常规 也会发生同样的情况echo "$foo",它会打印当前文件夹的内容。
在这个线程中,尤达建议使用以下颜色的解决方案zsh
#load colors
autoload colors && colors
for COLOR in RED GREEN YELLOW BLUE MAGENTA CYAN BLACK WHITE; do
eval $COLOR='%{$fg_no_bold[${(L)COLOR}]%}' #wrap colours between %{ %} to avoid weird gaps in autocomplete
eval BOLD_$COLOR='%{$fg_bold[${(L)COLOR}]%}'
done
eval RESET='$reset_color'
Run Code Online (Sandbox Code Playgroud)
如果我错了,请纠正我,但如果我理解正确,则autoload colors && colors允许您按名称调用颜色,而脚本的其余部分只是将它们包装在${ $}.
这让我想到了以下问题:
autoload colors && colors?我想知道是否有办法指定 zsh 中给定目录下的前 N 个文件。
我对递归枚举(即路径下递归的任何文件都被考虑用于枚举)和非递归(只考虑那些严格位于给定文件夹下的文件)的解决方案感兴趣。
谢谢!