如何使用终端的默认程序打开多个文件?

kar*_*aro 14 xdg-open

我试图从一个文件夹中打开我所有的 .mp3 文件,xdg-open 但我发现它只打开了一个!所以我搜索了一下,但没有这样的问题!我找到了“evince”,但显然它打开了文本文件,而 gnome-open 也打开了一个文件。

我想从终端打开文件夹中所有相同格式的文件。我是 Ubuntu 的新手,所以请多解释一下。

Ago*_*ath 10

的确。你可以使用 shell 来解决这个问题,就像这样:

ls *.mp3 | xargs -n 1 xdg-open
Run Code Online (Sandbox Code Playgroud)

不过,这非常简单,并且不适用于任何特殊情况(空格、非 ascii 字符)。对此的改进将是

ls -b *.mp3 | sed -e s+^+\"+ -e s+\$+\"+ | xargs -n 1 xdg-open
Run Code Online (Sandbox Code Playgroud)

但是,这种方式非常复杂。在这种情况下,一个更健壮但更简单的解决方案是使用 find:

find -iname '*.mp3' -print0 | xargs -0 -n 1 xdg-open
Run Code Online (Sandbox Code Playgroud)


Spa*_*awk 6

我写了一个小脚本/usr/local/bin/o,虽然你可以调用它/usr/local/bin/xdg-open并根据需要替换默认命令(假设你$PATH给它优先级)。此外,如果没有给出参数,此脚本将改为打开当前目录。

#!/usr/bin/env bash
if [ $# -eq 0 ]; then
  xdg-open . &> /dev/null
else
  for file in "$@"; do
    xdg-open "$file" &> /dev/null
  done
fi
Run Code Online (Sandbox Code Playgroud)

如果您不想不带参数地打开当前目录,这将保留默认行为,即显示用法。

#!/usr/bin/env bash
if [ $# -eq 0 ]; then
  xdg-open &> /dev/null
else
  for file in "$@"; do
    xdg-open "$file" &> /dev/null
  done
fi
Run Code Online (Sandbox Code Playgroud)

注意,这与默认程序解析多个参数的能力无关,而是为每个参数调用每个命令一次。我不认为有一个优雅的方法来解决这个问题,因为用户可能想要xdg-open不同类型的文件,而且一些命令无论如何都不会接受多个参数。