结合 sed 和 xargs 获得源和输出文件名

Mat*_*hew 3 bash sed xargs

我有一种情况,我有一些这样的输入文件:

M2U0001.MPG
M2U0180.MPG
Run Code Online (Sandbox Code Playgroud)

我想在目录中的每个类似命名的文件上运行一个命令(在 Bash shell 中)。我希望将当前文件名作为输入提供给此命令,并将文件名的修改版本作为输出文件提供。下面是一个例子:

ffmpeg -i M2U0001.MPG M2U0001_fixed.MPG
Run Code Online (Sandbox Code Playgroud)

我有使用 xargs 和 sed 的想法,但这是我得到的:

ls -1 *.MPG | xargs -I{} ffmpeg -i {} `echo {} | sed -r 's/[0-9]{2,}/&_fixed/'`
Run Code Online (Sandbox Code Playgroud)

但这会导致在两个位置都输出原始文件名。我完全以错误的方式解决这个问题吗?

我发现如果我像这样将文件名直接回显到嵌入的块中,它会起作用:

echo M2U0001.MPG | sed -r 's/[0-9]{2,}/&_fixed/'
Run Code Online (Sandbox Code Playgroud)

cYr*_*rus 6

或者:

for i in *.MPG ; do ffmpeg -i $i `basename $i .MPG`_fixed.MPG ; done
Run Code Online (Sandbox Code Playgroud)

感谢joshbaptiste提示