341
$ ls *mp3 | xargs mplayer  

Playing Lemon.  
File not found: 'Lemon'  
Playing Tree.mp3.  
File not found: 'Tree.mp3'  

Exiting... (End of file)  

ファイル「Lemon Tree.mp3」にスペースが含まれているため、コマンドが失敗し、xargs は 2 つのファイルと見なします。このようなファイル名で find + xargs を機能させることはできますか?

4

13 に答える 13

31

試す

find . -name \*.mp3 -print0 | xargs -0 mplayer

それ以外の

ls | grep mp3 
于 2013-05-26T10:56:35.370 に答える
10

Dick.Guertin の回答 [1] は、ファイル名のスペースをエスケープできることが、ここで提案されている他の解決策 (空白ではなくヌル文字を区切り文字として使用するなど) の貴重な代替手段であることを示唆しています。しかし、それはもっと単純かもしれません - あなたは本当にユニークなキャラクターを必要としません. sed にエスケープしたスペースを直接追加させることができます:

ls | grep ' ' | sed 's| |\\ |g' | xargs ...

さらに、grep は、名前にスペースが含まれるファイルのみが必要な場合にのみ必要ですより一般的には (たとえば、スペースを含むファイルと含まないファイルのバッチを処理する場合)、grep をスキップします。

ls | sed 's| |\\ |g' | xargs ...

もちろん、ファイル名には空白以外の空白 (タブなど) を含めることができます。

ls | sed -r 's|[[:blank:]]|\\\1|g' | xargs ...

これは、GNU sed や bsd sed の最近のバージョンなど、-r (拡張正規表現) をサポートする sed があることを前提としています (たとえば、FreeBSD 8 より前にオプション "-E" を最初に綴り、互換性のために -r と -E の両方をサポートする FreeBSD)。少なくとも FreeBSD 11 まで)。[]それ以外の場合は、基本的な正規表現文字クラスのブラケット式を使用して、区切り文字にスペースとタブ文字を手動で入力できます。

[1] これはおそらくその回答に対するコメントまたは編集としてより適切ですが、現時点ではコメントするのに十分な評判がなく、編集を提案することしかできません. 上記の後者の形式(grepなし)はDick.Guertinの元の回答の動作を変更するため、直接編集はおそらく適切ではありません。

于 2016-02-04T14:21:03.423 に答える
8
find . -name 'Lemon*.mp3' -print0 | xargs -­0 -i mplayer '{}' 

これは、私の場合、スペースを含むさまざまなファイルを削除するのに役立ちました。mplayer でも動作するはずです。必要なトリックは引用符です。(Linux Xubuntu 14.04 でテスト済み)

于 2015-10-04T08:58:06.770 に答える
4

ls | grep mp3 | sed -n "7p" | xargs -i mplayer {}

上記のコマンドでは、ファイルごとに が新たにxargs呼び出されることに注意してください。mplayerこれは には望ましくない場合mplayerがありますが、他のターゲットでは問題ない場合があります。

于 2014-08-25T16:08:26.873 に答える