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

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

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

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

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

或者,如果您希望它更强大,请尝试

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

你可以试试:

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

ls *.mp3列出当前目录中的所有mp3文件,每个文件都在其自己的行上,并且输出通过管道传送到while循环,读取每行的内容,它将打开该内容(这是一个名称)在这种情况下的mp3文件)在其默认应用程序中。

我写了一个小脚本/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不同类型的文件,并且一些命令无论如何都不会采用多个参数。

这是一个单行:

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

由于我安装了VLC(并且作为mp3的默认设置),这将打开包含VLC的目录中的所有mp3文件。 这不是任何forms的“ 普遍解决 – 一切都在工作,每一个怪异的案例 ”,但它应该有效。

说明:

ls -AQp列出“几乎所有”文件,引用文件名并将斜杠附加到目录名称。 如果要排除符号链接,请将-p替换为--file-type 。 引用文件名中的空格。

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

xargs将整个批次重定向到子shell返回后的程序。

子shell:

xdg-mime query default audio/mpeg为mime为audio/mpeg文件提供默认应用程序的名称,格式为“app.desktop”。 您可以使用xdg-mime query filetype /path/to/file检查环境中任何文件的mimetype。 我得到了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 ,那么你可能已经开始了,因为所讨论的应用程序可能会打开一个新实例中的每个文件,这可能会以多种方式变得丑陋。

我写了这个bash脚本来涵盖我能想到的所有用例:

 #!/bin/bash set -euo pipefail; shopt -s failglob # bash strict mode max=${max:-10} # Set default maximum if $max is not set [[ ${all:-} ]] && max=$# # Set max to all files if $all is non-null for file in "${@:1:$max}"; do xdg-open "$file" done &>>~/.xsession-errors 

特征:

  • 将错误输出写入〜/ .xsession-errors,而不是污染终端或丢弃它
  • 默认打开最多10个文件(不过载屏幕/处理器)
  • 可以设置一个新的最大值, max=20 open $(ls -Q)
  • 允许打开所有文件,例如all=1 open $(ls -Q)

您可以使用这些命令

 cd /path/to/source_folder find . -type f -name *.mp3 -exec vlc {} \+ 

仅当您的音乐播放器支持多个文件作为命令行参数时。 用您选择的音乐播放器替换vlc

这在我的测试中适用于RhythmBox和VLC。

如果要在VLC中打开文件,请将此命令用于mp3文件。

 vlc /directory/*.mp3 

注意:使用cvlc来使用没有接口的VLC。