私は 非画像ファイルのみをリスト を試みており、最新の500ファイルのみを検索しています。だから私は走る
ls -t | head -500 | file | grep -v 'image'
これは正しくありません。ヘルプメッセージが表示されます。に変更
ls -t | head -500 | xargs file | grep -v 'image'
必要な出力が得られる場合がありますが、ファイル名にスペースが含まれている場合(例:Plutonian\ Nights\ -\ Sun\ Ra.mp3
— xargs
が実行されますfile Plutonian
、file Nights
など.
スペースを表示するxargs
をどのように支援するか、または私が達成しようとしていることを達成するにはどうすればよいですか?
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
「-print0」オプションで「find」を使用し、「-0」オプションで出力を「xargs」にパイプします。
私はこのテクニックを知っています(そして使用しています)が、ユーザー@Jensが同様の質問に回答していることがわかります。
https://stackoverflow.com/questions/16758525/use-xargs-with-filenames-taining-whitespaces
役立つかもしれない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
スペースを含む可能性のあるファイル名の処理に関する一般的なアドバイスについては、 を参照してください。なぜシェルスクリプトが空白やその他の特殊文字を表示しないのですか?
あなたがやろうとしていることの難しさは、標準のツールで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'