다음을 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 릴리스, 현재 아치 및 우분투 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
사용하여 새로운 방법을 사용하고 이전 버전의 이전 방법으로 돌아가는 이진 파일을 필터링 하는 작은 스크립트를 만들었습니다 .-00
file
#!/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
스크립트 / 파이프 라인 어딘가에서 유틸리티를 사용하여 파일이 데이터인지 텍스트인지 식별 할 수 있습니다.