我尝试使用打开文件夹中的所有 .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
,您可能会遇到问题,因为所产生的应用程序可能会在新的实例中打开每个文件,这可能会在多个方面变得很糟糕。