如何使用 xargs 到 运行 bash -c 对带有单引号和双引号的文件名

How to use xargs to run bash -c on filenames with both single and double quotes

我正在尝试对文件夹中的每个文件使用 xargs 到 运行 ffmpeg 并输出具有 vorbis 音频的文件的名称。

我想出了以下大部分有效的方法,但它在文件名中有单引号的文件上失败了。

find . -maxdepth 1 | onlyvideos | tr '\n' '[=12=]' | xargs -n1 -0 -I '{}' bash -c "if ( ffmpeg -i '{}' 2>&1 | grep Stream | grep -q vorbis ) ; then echo '{}' ; fi;"

onlyvideos 是我编写的一个脚本,它只打印带有视频扩展名的文件名到标准输出。

如何在可能包含单引号和双引号或同时包含单引号和双引号的文件名上获得 xargs 到 运行 bash -c

所有这些都可以简化很多,也许,但如果你想坚持使用你的 onlyvideos 脚本,你可以尝试:

find . -maxdepth 1 | onlyvideos | tr '\n' '[=10=]' |
  xargs -n1 -0 bash -c 'if ( ffmpeg -i "" 2>&1 | grep Stream | grep -q vorbis ) ; then echo "" ; fi;' bash

解释:bash -c 'cmd' arg0 arg1 执行 cmd,位置参数设置为 [=14=]=arg0(在我们的例子中为 bash)和 =arg1(我们的文件名案例,通过 xargs)。因此,在您的命令脚本 'cmd' 中使用 "" 应该会如您所愿。

一种while风格

find . -maxdepth 1 | onlyvideos | while read f; do if ( ffmpeg -i "$f" 2>&1 | grep Stream | grep -q vorbis ) ; then echo "$f" ; fi; done