UNIX系システムでは、ASCII NUL文字とスラッシュを除き、ファイル名に任意の文字を使用することができます。スラッシュはパス名に(ディレクトリ区切り記号として)現れるが、実際のディレクトリエントリの名前には現れない。つまり、xargs
が読み取るファイルのリストには、空白、タブ、改行文字などの空白文字が含まれている可能性があります。既定では、xargs
は、読み取っているファイルのリストが引数の区切り記号として空白を使用すると仮定しているため、ファイル名に実際に空白が含まれている場合は正しく処理できません。これにより、デフォルトの動作はxargs
となり、任意のデータを処理するのにはほとんど役に立ちません。
この問題を解決するため、GNU findutilsはfindに対して '-print0'アクションを導入しました。これは、ASCII NUL文字を使用して、生成するファイルリスト内のエントリを区切ります。これは、パス名の中に現れない唯一の文字であるため、セパレータの理想的な選択肢です。 '-0'オプションをxargs
にすると、引数が空白ではなくASCII NULで区切られているとみなされます。また、デフォルトの動作であるxargs
の別の誤った機能を無効にします。これは、入力の文字を引用することに注意しています。 xargs
のいくつかのバージョンは、入力に孤立した '_'が表示されても終了しますが、GNU findはもはやそれを行いません(Unix標準ではオプションの動作になっています)。だから、
、xargsのと一緒-print0見つける入れ-0私たちは、このコマンドを取得する:
find /var/tmp/stuff -mtime +90 -print0 | xargs -0 /bin/rm
結果が正しくファイルのリストに表示される可能性のあるすべての文字を処理手続の効率的な方法であります削除する。これは良い知らせです。しかし、あなたが期待していると確信しているように、さらに悪いニュースがあります。問題は、これは移植可能な構造ではないということです。 Unixの他のバージョン(特にBSD由来のもの)は '-print0'をサポートしていますが、普遍的なものではありません。
'find ... -print0'と' xargs -0'は非標準のGNU拡張です。あなたはGNUユーティリティについて言及していますが、GNU以外の実装ではそれらの拡張機能が不足している可能性があることを明確にしていません。 –