我需要建立目錄樹中二進制文件的所有文件擴展名列表。如何列出目錄樹中的所有二進制文件擴展名?
主要問題將需要如何區分一個文本文件和二進制文件,其餘的應該是蛋糕。
編輯:這是我得到的最接近的,有更好的點子嗎?
find . -type f|xargs file|grep -v text|sed -r 's:.*\.(.*)\:.*:\1:g'
我需要建立目錄樹中二進制文件的所有文件擴展名列表。如何列出目錄樹中的所有二進制文件擴展名?
主要問題將需要如何區分一個文本文件和二進制文件,其餘的應該是蛋糕。
編輯:這是我得到的最接近的,有更好的點子嗎?
find . -type f|xargs file|grep -v text|sed -r 's:.*\.(.*)\:.*:\1:g'
這裏有一個竅門,找到二進制文件:
grep -r -m 1 "^" <Your Root> | grep "^Binary file"
的-m 1使得grep的未讀出所有文件。
清理和比我找到的解決方案更快,這裏是我使用'grep -r -m 1「^」apps | grep「^ Binary file」| sed -r':^ Binary \ sfile \ s(。 *)\ smatches:\ 1:g'' – dukeofgaming 2012-03-22 15:31:53
一個簡單的管道到'awk'{print $ 3}''更簡單... – 2014-10-28 20:53:32
Linux上的二進制文件和文本文件沒有區別。 file
實用程序查看內容和猜測。不幸的是,這並沒有太大的幫助,因爲file
不會產生簡單的「二進制或文本」答案。它有一個複雜的輸出,你需要解析大量的案例。
一種方法是讀取一些固定大小的文件前綴,比如說256字節,然後應用一些啓發式。例如,所有的字節值都是0x0到0x7F,避免了除普通空白之外的控制代碼?這表明ASCII?如果有字節0x80到0xFF,那麼整個緩衝區(除了可能被截斷的末尾的一個代碼除外)是否會解碼爲有效的UTF-8?等
一個想法可能是潛行利用檢測二進制文件,如GNU diff
的實用程序。
$ diff -r /bin/ls <(echo foo)
Binary files /bin/ls and /dev/fd/63 differ
沒有進程替換,仍然有效:
$ diff -r /bin/ls /dev/null
Binary files /bin/ls and /dev/null differ
現在只要用grep的,輸出和查找單詞Binary
。
問題是diff
的啓發式二進制文件是否適用於您的目的。
您可以嘗試使用'file -i',這會導致它將文件格式輸出爲MIME類型。然後,您可以檢查MIME類型是否具有「text /」前綴。我想這可能工作得很好。 – 2012-03-21 21:53:14
很高興知道,謝謝!我正在瀏覽手冊頁,從'file'搜索更加精簡的輸出空間,但沒有發現這一點。 – Kaz 2012-03-21 21:57:37
沒有確定的方法來區分「文本」文件和「二進制」文件,這是猜測工作。
#!/bin/bash
guess=`echo \`head -c 4096 $1 | strings -a -n 1 | wc -c \` '* 1.05 /' \`head -c 4096 $1 | wc -c \` | bc `;
if [ $guess -eq 1 ] ; then
echo $1 "is text file"
exit 0
else
echo $1 "is binary file"
exit 1
fi
這佩爾利一個班輪工作對我來說,這也是相當快:
find . -type f -exec perl -MFile::Basename -e 'print (-T $_ ? "" : (fileparse ($_, qr/\.[^.]*/))[2] . "\n") for @ARGV' {} + | sort | uniq
,這是你可以找到在當前文件夾中的所有二進制文件:
find . -type f -exec perl -e 'print (-B $_ ? "$_\n" : "") for @ARGV' {} +
-T是對文本文件的測試,-B是二進制文件,它們是相互對立的*。
這裏是一個班輪在Python檢查,如果是二進制文件:
b"\x00" in open("/etc/hosts", "rb").read()
查找殼遞歸地使用它,見下面的例子:
IS_BINARY='import sys; sys.exit(not b"\x00" in open(sys.argv[1], "rb").read())'
find . -type f -exec bash -c "python -c '$IS_BINARY' {} && echo {}" \;
要查找所有非二進制文件,請將&&
更改爲||
。
下面是簡單的命令列出使用GNU grep
所有二進制文件(包括NULL character):
grep -Palr '\x00' .
要打印的文件擴展名少於5個字,我們可以使用awk
,然後使用過濾掉重複要麼是uniq
要麼是sort
。
所以都在一起應該是這樣的:
grep -Palr '\x00' . | awk -F. '{if (length($NF) < 5) print $NF}' | sort -u
如何UTF-8編碼的文本文件?把它算作一個二進制文件? – PasteBT 2012-03-21 21:46:05
按照慣例,可執行二進制文件沒有擴展名。 – jordanm 2012-03-21 22:04:13
@jordanm除了那顆明星之外,還有一個大膽的顏色。 *鴨* :) – Kaz 2012-03-22 01:23:12