我一直在取得进展,但我不知道如何从这里继续。我使用inotifywait
(-d
守护程序)开关来输出一个文件,其中列出了放入观看文件夹中的视频文件。
该列表是必需的,因为调整音量级别和重新编码非常耗时,而且我不想错过任何事件。我的问题在于如何将数据实际操作为我可以在zsh
脚本中使用的东西。各行使用以下格式
/path/to/file containing/white spaces/ CLOSE_WRITE,CLOSE file name with white spaces
我需要的是
/path/to/file\ containing/white\ spaces/filename\ with\ white\ spaces.extension
路径会发生变化,子文件夹的层数也会发生变化,文件名也会发生变化。一致的是** CLOSE_WRITE,CLOSE **
(前面一个空格和后面一个空格),如果有人愿意教育我如何删除脚本中的这部分行,zsh
我认为(希望,实际上)我知道足够多,我可以在剩余的空格带有反斜杠,并在不再需要使用Vim
命令行和我遇到的代码片段后删除该行。
我已经有了我需要的大部分内容,事实上我已经编写了可以自动转换文件几个小时的脚本或者调整音量级别,我只需要这个将它们结合在一起(我什至有计划在启动时检查未转换的文件 - 加上弄清楚如何创建原子文件/文件夹锁,创建一个新的 tmux 会话,以便我可以注销,但是让我的计算机保持运行 - 至少直到我修复我的桌面,甚至可能学会使用并行,但这一切都会稍后发生)
非常感谢任何和所有的帮助。
答案1
您可以使用该--format
选项inotifywait
更改输出格式。这只会在文件关闭时打印文件名,而不是事件类型:
inotifywait -eclose_write -m --format "%w%f" -q /path/to/target/dir
它似乎不支持 C 风格转义 ( \0
) 并坚持在每个事件末尾打印换行符,所以我希望您的文件名中没有包含换行符。
答案2
从man parallel
:
示例:GNU Parallel 作为目录处理器
如果您有一个目录,用户可以在其中放置需要处理的文件,您可以在 GNU/Linux 上执行此操作(如果您知道在其他平台上调用 inotifywait 的内容,请提交错误报告):
inotifywait -qmre MOVED_TO -e CLOSE_WRITE --format %w%f my_dir |\ parallel -u echo
这将对放入 my_dir 或 my_dir 的子目录中的每个文件运行命令 echo。
您当然可以使用 -S 将作业分发到远程计算机:
inotifywait -qmre MOVED_TO -e CLOSE_WRITE --format %w%f my_dir |\ parallel -S .. -u echo
这听起来非常接近您希望做的事情。
要学习 GNU Parallel,请遵循“man parallel”开头的“读者指南”。