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



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

我已经提出了下面的工作,大部分,但它失败的文件中有单引号的文件名。

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

onlyvideos是我写的一个脚本,只打印具有视频扩展名的文件名称到stdout。

我怎么能让xargs运行bash -c上的文件名,可能包括一个或两个单引号和双引号?

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

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

解释:bash -c 'cmd' arg0 arg1执行cmd,位置参数设置为$0=arg0(在本例中为bash)和$1=arg1(在本例中为文件名,由xargs传递)。因此,在命令脚本中使用"$1",'cmd'应该可以像您期望的那样工作。

whilestyle

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