パイプを使用してファイルを開くプログラムにファイルを渡す

パイプを使用してファイルを開くプログラムにファイルを渡す

音楽トラックを含むフォルダがありますが、Music整理がうまくいきません。したがって、特定のトラックを見つけるには、通常、次のように入力します。ファイル名に含まれると予想される特定のキーワードはls Music | grep <keyword>どこにありますか?<keyword>次に、コマンドラインで私が探しているファイル名を返し、<name>音楽ファイルを開くにはvlc <name> &

私の質問は、これらすべてを単一の作業に単純化することは可能ですか?を試してみls Music | grep <keyword> | vlcましたが失敗しました。どうすればいいですか?

(より一般的には、この目的のためにパイプをどのように使用しますか?)

答え1

xargsこの目的に使用できます。標準入力にパイプされた内容を取得し、サブコマンドの引数として使用します。したがって、あなたの場合は、次のように見えることがあります。

ls Music | grep <keyword> | xargs vlc &

このコマンドシーケンス、特にスペースにはいくつかの問題がまだある可能性があります。デフォルトでは、入力はスペースに分割されているため、名前がファイルのxargs場合、5つの別々の引数が、、、、、Artist Name - Track Name.mp3で送信されます。xargs幸いなことに、この問題を解決する方法があります。オプションを使用すると、入力は null を使用するサブコマンドの引数に分割されます。このコマンドは、空の区切り文字に一致するファイル名の作成をサポートしていることがわかりました(他のものよりもファイルを見つけるのに優れたツールです)。vlcArtistName-TrackName.mp3-0xargs\0findfindls | grep

したがって、これはより良いパイプラインになります。

find Music -iname '*<keyword>*' -print0 | xargs -0 vlc &

答え2

xargsの使い方を学ぶのは便利ですが、ここでは特別なこの場合、1つのグローブのみを使用することをお勧めします。

vlc Music/*keyword* &  ## will find all filenames containing the string 'keyword'

再帰したい場合(サブディレクトリの検索など)、globstarシェルオプションを使用できます。

shopt -s globstar
vlc Music/**/*keyword* &

関連情報