web-dev-qa-db-ja.com

ファイル名にスペースを含む `xargs`

私は 非画像ファイルのみをリスト を試みており、最新の500ファイルのみを検索しています。だから私は走る

ls -t | head -500 | file | grep -v 'image'

これは正しくありません。ヘルプメッセージが表示されます。に変更

ls -t | head -500 | xargs file | grep -v 'image'

必要な出力が得られる場合がありますが、ファイル名にスペースが含まれている場合(例:Plutonian\ Nights\ -\ Sun\ Ra.mp3xargsが実行されますfile Plutonianfile Nightsなど.


スペースを表示するxargsをどのように支援するか、または私が達成しようとしていることを達成するにはどうすればよいですか?

7
isomorphismes

xargsを使用すると、次のように実行できます。

find . -type f -print0 | xargs -0 file | grep -v 'image' 

しかし、xargsは昨日とてもそうです。かっこいい子供たちは今日parallelを使っています。パラレルを使用すると、次のようになります。

find . -type f | parallel file | grep -v 'image'

見る。 -print0および-0は使用しません。 parallelはそれ自体が本当に賢いです。

[〜#〜]更新[〜#〜]

最新の500ファイルのみをリストする場合、コマンドは次のようになります。

ls -1t | head -500 | parallel file {} | grep -v image

重要

パラレルが古く、上記の構文が機能しない場合は、ここで説明されているように新しいバージョンのパラレルをインストールします。 http://www.gnu.org/software/parallel/parallel_tutorial.html

5
shivams

「-print0」オプションで「find」を使用し、「-0」オプションで出力を「xargs」にパイプします。

私はこのテクニックを知っています(そして使用しています)が、ユーザー@Jensが同様の質問に回答していることがわかります。

https://stackoverflow.com/questions/16758525/use-xargs-with-filenames-taining-whitespaces

2
Prem

役立つかもしれない2つの大まかな提案があります。どちらも特に満足しているようには感じません。

まず、sedを使用してすべてに引用符を追加します。そのため、ファイル名に次のような引用符がある場合にのみ問題が発生します。

ls -t | head -500 | sed -e 's/\(.*\)/"\1"/' | xargs file | grep -v 'image'

もう1つは、lsを使用して最新の501番目を検索し、次にfindを使用して次のような新しいものを取得することです。

find -newer $(ls -t | head -501 | tail -1) -type f -exec file {} \; | grep -v image
1
Eric Renouf

スペースを含む可能性のあるファイル名の処理に関する一般的なアドバイスについては、 を参照してください。なぜシェルスクリプトが空白やその他の特殊文字を表示しないのですか?

あなたがやろうとしていることの難しさは、標準のツールでN個の最新のファイルを一覧表示する素晴らしい方法がないということです。

ここで行っていることを行う最も簡単な方法は、シェルとして zsh を使用することです。日付でファイルをソートする glob修飾子 があります。最新の500ファイルでfileを実行するには:

file *(om[1,500])

Linuxのfileユーティリティでは、-iまたは--mime-typeオプションを渡して、解析しやすい出力を取得します。画像ファイルは、image/somethingで終わる行で識別されます。

file --mime-type *(om[1,500]) | sed -n 's~: *image/[^ ]*$~~p'

名前に改行が含まれているものも含めて、すべてのファイル名に対応する必要がある場合は、-0オプションを使用してヌル区切りの出力を作成してください。 GNU= sedの最近のバージョンでは、改行の代わりにnullバイトをレコード区切り文字として使用できます。

file --mime-type -- *(om[1,500]) | sed -zn 's~: *image/[^ ]*$~~p'

Zshがない場合は、lsを使用して、-L1オプションをfileに渡すことにより、スペースを含むが改行や末尾のスペースを含まないファイル名に対処できます。これにより、一度に1つのファイルに対してfileが呼び出されたため、少し遅くなります。

ls -t | head -n 500 | xargs -L1 file --mime-type -- | sed -n 's~: *image/[^ ]*$~~p'