Answers:
确实。您可以使用shell来解决此问题,如下所示:
ls -b *.mp3 | xargs -n 1 xdg-open
或者,如果您希望它更坚固,请尝试
find -iname '*.mp3' -print0 | xargs -0 -n 1 xdg-open
find: paths must precede expression: -
)。
.
并得到了相同的错误消息。在另一个目录中,可以xdg-open: unexpected argument './foo.mp3'
使用或不使用.
。
你可以试试:
ls *.mp3 | while read -r file; do xdg-open "$file"; done
ls *.mp3
将列出当前目录中的所有mp3文件,每个文件都在其单独的行中,并将输出通过管道传递到while
循环中,读取每一行的内容,它将打开该内容(在这种情况下,这是mp3文件的名称) )在其默认应用程序中。
-r
标志。我认为这是正确解析名称中带有`\`的文件所必需的。
man read
也根本没有列出任何标志!我的测试中没有出现错误,但这可能是因为我创建了aaa
和aa\a
。在这种情况下,xdg-open
只需尝试打开aaa
两次,而不是aa\a
。(好吧,这有点令人费解,但是我认为代码应该适用于所有情况。find
为了避免ls
and 的局限性,也许是一个更好的选择read
。)此外,它如何造成严重的破坏?难道不只是要解析输出ls
吗?
man read
引用读取的C函数(该人的第2节)。这read
是一个bash内置命令,因此您应该在man bash
4632行中查找。@Sparhawk-感谢edititng。
我写了一个小脚本/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
不同类型的文件,并且某些命令无论如何都不会采用多个参数。
我写了这个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
特征:
max=20 open $(ls -Q)
all=1 open $(ls -Q)
这里是单线:
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
将整个程序重定向到以下subshell返回的程序。
子壳:
xdg-mime query default audio/mpeg
给出mime为的文件的默认应用程序名称,格式为“ app.desktop” audio/mpeg
。您可以使用来检查环境中任何文件的mimetype xdg-mime query filetype /path/to/file
。我得到了mp3文件的“音频/ 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
,则很可能会碰壁,导致所涉及的应用程序可能会在新实例中打开每个文件,这可能会以多种方式造成丑陋。
您可以使用这些命令
cd /path/to/source_folder
find . -type f -name *.mp3 -exec vlc {} \+
仅当您的音乐播放器支持多个文件作为命令行参数时。vlc
用您选择的音乐播放器替换。
在我的测试中,这可与RhythmBox和VLC一起使用。
find
...... -exec
对每个文件运行单独的命令?而且,如果您的音乐播放器支持多个文件作为命令行参数,则可以使用vlc *.mp3
。
\+
结尾
find
都要硬编码似乎毫无意义vlc
。(问题表明它们都在一个目录中。)
+
就足够了,没有必要\+
。
xdg-open
默认情况下应该真正能够做到这一点...只需将参数列表传递给程序即可。快来freedesktop.org上的人吧!:-)