コマンドの出力を rm コマンドにパイプします。

コマンドの出力を rm コマンドにパイプします。

次のコマンドは、再生中の曲のパスを印刷します。

mpc | head -n 1 
songs/oldSongs/Mukesh_D/041 KANHAIYA = YAAD AAYI ADHI RAAT KO.mp3

ファイルを印刷するコマンドを変更してファイルを削除できますか?

答え1

より一般的な質問に答えるには、xargs標準入力の単語リストを取得してコマンドの引数リストに変換する必要があります。

ただしxargs、リストは、単一引用符、二重引用符、およびバックスラッシュを使用してエスケープされた空白、タブ、および改行(ロケールとxargsの実装に応じてより多くの空白文字を使用できる)で区切られた単語のリストとして期待されます。 xargsの別の実装を介してネストされているという点で動作)。

入力が改行で終わるリストの場合規範的アプローチこれをxargsに変換します。予想される形式は、すべての文字をエスケープすることです(バックスラッシュ、一重引用符、二重引用符、アンダースコア(おそらく)、スペースおよびタブのみが必要ですが(Cロケール以外の場合は他のスペースも必要です))バックスラッシュ文字の改行文字にsed

mpc | head -n 1 | sed 's/./\\&/g' | xargs rm --

一部のxargs実装では、標準入力で予想される最大行長の制限がやや低いため、これを使用して必要な文字だけをエスケープできます。

少なくともGNUではxargsこれを行う必要はありません。次のようにします。

mpc | head -n 1 | xargs -rd '\n' rm --

(また、入力が空のときにコマンドを実行しないようにするには、GNU関連の-rオプションを使用してください。)

答え2

を使用してこれを行うことができますrm -i "/path/to/music/library/$(mpc -f %file% | head -n 1)"。ただし、ファイル名に改行文字が含まれている場合、これが中断されることに注意してください。の出力はmpc -f %file%音楽ライブラリのパスに相対的であるため、出力前に追加する必要があります。

答え3

個人的にはxargsは興味深いと思いますが、屋根ふき機能をより好みます。なぜ?まあ、それはより柔軟性を提供し、スペースを処理する非常に簡単な方法も提供します。

mpc | head -n 1 | while read filename
do
  ls -al "$filename"  # Look at the file you're deleting
  rm -i "$filename"   # Ask if you want it deleted (or not)
done

このようにwhileループを使用すると、変数を参照するために「read」の後に続く変数名にデータが注入されます。前にドル記号が必要です。引用符はスペースをエレガントに処理するために存在するため、区切り記号のようには見えません。このようなループは単純な単一ラインほどエレガントではありませんが、より柔軟性を提供し、長期的に非常に便利です。

答え4

二重引用符や改行文字を含むファイルがないと仮定するのが安全な場合は、次のことができます。

mpc | head -n 1 | sed  's/^/"/g ; s/$/"/g' | xargs rm --

sedはファイル名の周りに引用符を追加し、xargsは取得した入力を実行中のコマンド(この場合はrmコマンド)の引数に変換します。

関連情報