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

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

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

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

答案1

确实如此。您可以使用 shell 来解决这个问题,如下所示:

ls *.mp3 | xargs -n 1 xdg-open

不过,这太简单了,不适用于任何特殊情况(空格、非 ASCII 字符)。对此的改进是

ls -b *.mp3 | sed -e s+^+\"+ -e s+\$+\"+ | xargs -n 1 xdg-open

不过,这种方式相当复杂。在这种情况下,更强大但更简单的解决方案是使用 find:

find -iname '*.mp3' -print0 | xargs -0 -n 1 xdg-open

答案2

我写了一个小脚本/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

如果您不想在没有参数的情况下打开当前目录,这将保留默认行为,即显示用法。

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

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

答案3

你可以试试:

ls *.mp3 | while read -r file; do xdg-open "$file"; done

ls *.mp3将列出当前目录中的所有 mp3 文件,每个文件占一行,并将输出通过管道传输到一个while循环,该循环读取每行的内容,并将在其默认应用程序中打开该内容(在本例中是 mp3 文件的名称)。

答案4

以下是一行代码:

ls -AQp | grep "\.mp3\"$" | xargs `xdg-mime query default audio/mpeg | grep -oP '.+(?=\.desktop)'`

由于我安装了 VLC(并且是 mp3 的默认设置),因此这会使用 VLC 打开目录中的所有 mp3 文件。这不是任何类型的“通用解决所有问题并适用于所有情况“, 但它应该工作。

解释:

ls -AQp列出“几乎所有”文件,引用文件名并在目录名称后附加斜线。如果您还想排除符号链接,请替换-p--file-type。如果文件名中有空格,请引用。

grep "\.mp3\"$"仅选择以“.mp3”(加双引号)结尾的文件。

xargs将所有内容重定向到以下子 shell 返回的程序。

子外壳:

xdg-mime query default audio/mpeg给出默认应用程序的文件的 mime 格式为“app.desktop” audio/mpeg。您可以使用检查环境中任何文件的 mimetype xdg-mime query filetype /path/to/file。我得到的 mp3 文件为“audio/mpeg”。

grep -oP '.+(?=\.desktop)'从“app.desktop”获取“app”。

如果您要在不会有太大变化的系统中频繁使用它,您可能需要将其缩短如下:

ls -AQp | grep "\.mp3\"$" | xargs default_app

用实际打开文件的程序替换它default_app。你可以用以下命令找出它的名称:

xdg-mime query default audio/mpeg | grep -oP '.+(?=\.desktop)'


xdg-open无法解决这个问题,因为它在设计上只接受一个参数。如果使用xargs -n1,您可能会遇到问题,因为所产生的应用程序可能会在新的实例中打开每个文件,这可能会在多个方面变得很糟糕。

相关内容