ファイル名にスペースがある「xargs」

ファイル名にスペースがある「xargs」

頑張る画像以外のファイルのみを一覧表示、最新の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 Plutonianfile Nights


スペースを見るのにどのように役立つか、xargs私が達成したいことを達成できますか?

答え1

を使用すると、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

答え2

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

私はこの技術を知って使用していますが、@Jensユーザーが同様の質問に答えたのを見ました。ここで詳細を確認できます。

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

答え3

役に立つおおよその2つの提案があります。しかし、どちらもそれほど満足していないので、おそらくより良いものが出てくるかもしれません。

まず、sed を使用してすべての項目に引用符を追加します。したがって、ファイル名に引用符がある場合にのみ問題が発生します。

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

別の方法は、lsを使用して最新の501を見つけ、findを使用して最新のエントリを取得することです。

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

答え4

あなたは試すことができます

printf "%s\0" $(ls -t | head -500) | xargs -0 file | grep -v image

これにより、xargsはnullで区切られたファイル名引数を使用します。

関連情報