をbash使用して非バイナリファイルのみを処理する一般的なソリューションfile -b --mime-encoding:
while IFS= read -d '' -r file; do
  [[ "$(file -b --mime-encoding "$file")" = binary ]] &&
    { echo "Skipping   $file."; continue; }
  echo "Processing $file."
  # ...
done < <(find . -type f -print0)
ファイルユーティリティの作成者に連絡し、-00バージョン5.26で気の利いたパラメーターを追加しました(2016-04-16リリース、現在のArchとUbuntu 16.10など)。file\0result\0一度にフィードされる複数のファイルを印刷します。例えば:
find . -type f -exec file -00 --mime-encoding {} + |
  awk 'BEGIN{ORS=RS="\0"}{if(NR%2)f=$0;else if(!/binary/)print f}' | …
(awk一部は、非バイナリではないすべてのファイルを除外することです。ORS出力セパレータです。)
もちろん、ループでも使用できます。
while IFS= read -d '' -r file; do
  echo "Processing $file."
  # ...
done < <(find . -type f -exec file -00 --mime-encoding {} + |
  awk 'BEGIN{ORS=RS="\0"}{if(NR%2)f=$0;else if(!/binary/)print f}')
これと前のものに基づいて、新しいバージョンのパラメータをbash使用して新しい方法を利用し、古いバージョンでは前の方法にフォールバックする、バイナリファイルをフィルタリングするための小さなスクリプトを作成しました。-00file
#!/bin/bash
# Expects files as arguments and returns the ones that do
# not appear to be binary files as a zero-separated list.
#
# USAGE:
#   filter_binary_files.sh [FILES...]
#
# EXAMPLE:
#   find . -type f -mtime +5 -exec ./filter_binary_files.sh {} + | xargs -0 ...
# 
[[ $# -eq 0 ]] && exit
if [[ "$(file -v)" =~ file-([1-9][0-9]|[6-9]|5\.([3-9][0-9]|2[6-9])) ]]; then
  file -00 --mime-encoding -- "$@" |
    awk 'BEGIN{ORS=RS="\0"}{if(NR%2)f=$0;else if(!/binary/)print f}'
else
  for f do
    [[ "$(file -b --mime-encoding -- "$f")" != binary ]] &&
      printf '%s\0' "$f"
  done
fi
または、ここにもっとPOSIX-yがありますが、次のサポートが必要ですsort -V。
#!/bin/sh
# Expects files as arguments and returns the ones that do
# not appear to be binary files as a zero-separated list.
#
# USAGE:
#   filter_binary_files.sh [FILES...]
#
# EXAMPLE:
#   find . -type f -mtime +5 -exec ./filter_binary_files.sh {} + | xargs -0 ...
# 
[ $# -eq 0 ] && exit
if [ "$(printf '%s\n' 'file-5.26' "$(file -v | head -1)" | sort -V)" = \
    'file-5.26' ]; then
  file -00 --mime-encoding -- "$@" |
    awk 'BEGIN{ORS=RS="\0"}{if(NR%2)f=$0;else if(!/binary/)print f}'
else
  for f do
    [ "$(file -b --mime-encoding -- "$f")" != binary ] &&
      printf '%s\0' "$f"
  done
fi
               
              
file、ファイルがデータまたはテキストであるかどうかを識別するために、スクリプト/パイプラインのユーティリティのどこかに