回答:
確かに。次のように、シェルを使用してこれを回避できます。
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
wilは現在のディレクトリからすべてのmp3ファイルをリストします。各ファイルは独自の行にあり、出力はwhile
ループにパイプされて各行のコンテンツを読み取り、そのコンテンツ(この場合はmp3ファイルの名前)を開きます。 )デフォルトのアプリケーションで。
-r
フラグを追加しました。これは、名前に「\」が含まれるファイルを正しく解析するために必要だと思います。
man read
フラグもまったくリストされていません!テストでエラーは発生しませんが、おそらくを作成aaa
したためaa\a
です。この場合、でなく、2回xdg-open
だけ開こうとします。(オーケー、少し回旋なってきたが、私はコードがすべての状況のために働くべきだと思います。おそらく、より良い選択肢である、の制限を回避するためにして。)また、どのようにそれは正確に大混乱をもたらすことができますか?の出力を解析するだけではありませんか?aaa
aa\a
find
ls
read
ls
man read
は、C関数read(男のセクション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
注意:これは、複数の引数を解析するデフォルトプログラムの機能については不可知ですが、代わりに各引数に対して各コマンドを1回呼び出します。ユーザーが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
次のサブシェルが返すプログラムにロット全体をリダイレクトします。
サブシェル:
xdg-mime query default audio/mpeg
与えデフォルトアプリパントマイムあるファイルのフォーマット『app.desktop』での名前をaudio/mpeg
。を使用して、環境内の任意のファイルのmimetypeを確認できますxdg-mime query filetype /path/to/file
。mp3-fileの「audio / mpeg」を取得しました。
grep -oP '.+(?=\.desktop)'
「app.desktop」から「アプリ」を取得します。
あまり変更しないシステムで非常に頻繁に使用する場合は、これを短くすることをお勧めします。
ls -AQp | grep "\.mp3\"$" | xargs default_app
default_app
ファイルで開く実際のプログラムで置き換える場所。これで名前を把握できます:
xdg-mime query default audio/mpeg | grep -oP '.+(?=\.desktop)'
xdg-open
設計上1つの引数のみを受け入れるため、この問題は機能しません。を使用するとxargs -n1
、問題のアプリが新しいインスタンスですべてのファイルを開く可能性があり、複数の方法でいものになる可能性があります。
これらのコマンドを使用できます
cd /path/to/source_folder
find . -type f -name *.mp3 -exec vlc {} \+
音楽プレーヤーがコマンドライン引数として複数のファイルをサポートしている場合のみ。vlc
お好みの音楽プレーヤーに交換してください。
私のテストでは、これはRhythmBoxとVLCで動作します。
find
... -exec
各ファイルで個別のコマンドを実行しませんか?また、音楽プレーヤーがコマンドライン引数として複数のファイルをサポートしている場合は、単に使用できますvlc *.mp3
。
\+
終わり
find
ハードコーディングする場合は使用する意味がありませvlc
ん。(質問は、それらがすべて1つのディレクトリにあることを示唆しています。)
+
で十分です\+
。
xdg-open
デフォルトで実際にこれを行うことができるはずです...引数リストをプログラムに渡すだけです。freedesktop.orgの人々に来てください!:-)