में केवल प्रक्रिया गैर बाइनरी फ़ाइलें करने के लिए एक सामान्य समाधान 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
अपनी स्क्रिप्ट / पाइपलाइन में कहीं न कहीं उपयोगिता का उपयोग करके यह पहचान सकते हैं कि फ़ाइल डेटा है या टेक्स्ट