すべての「非バイナリ」ファイルを探す

すべての「非バイナリ」ファイルを探す

findこのコマンドを使用して、ディレクトリ内の「バイナリではない」ファイルをすべて見つけることができますか?これが私が解決したい問題です。

Windowsユーザーからファイルアーカイブを受け取りました。アーカイブにはソースコードとイメージファイルが含まれています。私たちのビルドシステムは、Windows行の終わりを持つファイルをうまく処理しません。flip -u* nixとwindowsの間に行末を反転するコマンドラインプログラム()があります。だから私はこのようなことをしたい。

find . -type f | xargs flip -u

ただし、イメージファイルまたは他のバイナリメディアファイルに対してこのコマンドを実行すると、ファイルが破損します。私はファイル拡張子のリストを作成し、それを使ってフィルタリングできることを知っていますが、そのリストを最新の状態に保つことに頼らない機能をしたいと思います。

もしそうなら、ディレクトリツリーでバイナリ以外のすべてのファイルを見つける方法はありますか?それとも別のソリューションを検討する必要がありますか?

ベストアンサー1

出力を使用しfile、grepまたはawkにパイプしてテキストファイルを見つけ、出力fileのファイル名部分のみを抽出してxargsにパイプします。

それは次のとおりです。

file * | awk -F: '/ASCII text/ {print $1}' | xargs -d'\n' -r flip -u

grep は「テキスト」ではなく「ASCII テキスト」を検索します。リッチテキスト文書やUnicodeテキストファイルなどを混乱させたくありません。

find以下を使用するか、別の方法で確認するファイルのリストを作成することもできますfile

find /path/to/files -type f -exec file {} + | \
  awk -F: '/ASCII text/ {print $1}' | xargs -d'\n' -r flip -u

xargsの引数は、-d'\n'xargsが各入力行を別々の引数として処理し、スペースやその他の問題のある文字を含むファイル名を処理するようにします。つまり、xargs -0入力ソースが NULL で区切られた出力 (たとえば、findのオプション) を生成しないか、または生成できない-print0場合の代替です。変更ログによると、xargsは2005年9月に-d/オプションを取得した--delimiterので、古代以外のすべてのLinuxディストリビューションに存在する必要があります(わからないので確認しました。これが「最近の」追加項目であることを曖昧に覚えています)。

改行はファイル名の有効な文字なので、ファイル名に改行が含まれていると中断されます。一般的なUNIXユーザーにとって、これは病理学的に狂ったことですが、ファイルがMacまたはWindowsコンピュータに由来する場合は聞いたことがないことはありません。

また、これはfile完璧ではないことに注意してください。ファイルのデータ型を検出するのは非常に効果的ですが、時には混乱します。

私は過去にこの方法のバリエーションを何度もうまく使用してきました。

おすすめ記事