web-dev-qa-db-ja.com

最後のスラッシュの前の行の一部を取得する

私のMPDアルバムアート、アルバムフォルダー内の 'folder.jpg'を表示するコンキスクリプトを作成しようとしています。私の現在の計画はmpc -f %file%は、ファイル名とパスを出力し、実際のファイル名(つまり、最後の/の後のすべて)を切り取り、conkyのイメージオブジェクトのパスとして使用します。

特に、いくつかの曲が2つのフォルダーにネストされているものと、1つのフォルダーにあるものがあるため、grep/cutで問題が発生しています。 (grep -m 1 . |cut -f1 -d /はシングルフォルダーのアルバムで機能します)

これについてどうすればいいですか?私が見逃しているもっと簡単な方法はありますか?

7
rargh

このルールを単一の文字列に適用する場合は、sedの代わりに(他の回答を参照)、dirnameコマンドを使用できます。

$ dirname "1 2/3 4/5 6/file"
1 2/3 4/5 6
3
vinc17

Grepはこの仕事の最後のツールではありません。 grep -m 1 .は、空ではない最初の行を出力しますが、これは役に立ちません。 grepやその他のツールを含む複雑なソリューションを構築できますが、簡単な方法は sed を使用することです。 1つの方法は、スラッシュ以外の文字の最後のランとその前のスラッシュを空の文字列で置き換えることです。

mpc -f %file% | sed 's:/[^/]*$::'

または、最後のスラッシュまですべてを保持し、次のものを破棄します。

mpc -f %file% | sed 's:^\(.*\)\(/.*\)$:\1:'

/が含まれていない場合、つまりディレクトリを指定せずにファイル名を渡した場合、どちらの方法でも入力は変更されないことに注意してください。これが問題であればsedで解決できますが、 dirnameコマンド を呼び出す方が簡単です。

dirname -- "$(mpc -f %file%)"

シェルスクリプトでは、 パラメータ展開 構成を使用することもできますが、結果を出力するだけの場合は、さらに複雑になります。

full_path="$(mpc -f %file%)"
case "$full_path" in
  */*) directory_part="${full_path%/*}"
  *) directory_part="."
printf '%s\n' "$directory_part"